with strip_tags remove quitar etiquetas ent_quotes php regex htmlpurifier

php - strip_tags - eliminar la etiqueta de script del contenido HTML



strip_tags mysql (10)

Corta:

$html = preg_replace("/<script.*?//script>/s", "", $html);

Al hacer regex las cosas pueden salir mal, entonces es más seguro hacer esto:

$html = preg_replace("/<script.*?//script>/s", "", $html) ? : $html;

De modo que cuando ocurre el "accidente", obtenemos el $ html original en lugar de una cadena vacía.

Estoy usando HTML Purifier (http://htmlpurifier.org/)

Solo quiero eliminar etiquetas <script> . No quiero eliminar el formato en línea ni ninguna otra cosa.

¿Cómo puedo conseguir esto?

Una cosa más, hay alguna otra manera de eliminar las etiquetas de script de HTML


Debido a que esta pregunta está etiquetada con regex , voy a responder con la solución del pobre en esta situación:

$html = preg_replace(''#<script(.*?)>(.*?)</script>#is'', '''', $html);

Sin embargo, las expresiones regulares no son para analizar HTML / XML, incluso si escribe la expresión perfecta , eventualmente se romperá, no vale la pena, aunque, en algunos casos, es útil corregir rápidamente algunas marcas, y como sucede con las soluciones rápidas, olvidarse de la seguridad Use expresiones regulares solo en el contenido / marcado en el que confíe.

Recuerde, cualquier cosa que las entradas del usuario se consideren no seguras .

La mejor solución sería usar DOMDocument que está diseñado para esto. Aquí hay un fragmento que demuestra lo fácil, limpio (en comparación con regex), (casi) confiable y (casi) seguro es hacer lo mismo:

<?php $html = <<<HTML ... HTML; $dom = new DOMDocument(); $dom->loadHTML($html); $script = $dom->getElementsByTagName(''script''); $remove = []; foreach($script as $item) { $remove[] = $item; } foreach ($remove as $item) { $item->parentNode->removeChild($item); } $html = $dom->saveHTML();

He eliminado el HTML intencionalmente porque incluso esto puede bork .


Esta es una variante simplificada de la respuesta de Dejan Marjanovic:

function removeTags($html, $tag) { $dom = new DOMDocument(); $dom->loadHTML($html); foreach (iterator_to_array($dom->getElementsByTagName($tag)) as $item) { $item->parentNode->removeChild($item); } return $dom->saveHTML(); }

Se puede usar para eliminar cualquier tipo de etiqueta, incluido <script> :

$scriptlessHtml = removeTags($html, ''script'');


He estado luchando con esta pregunta. Descubrí que solo necesitas una función. explotar (''>'', $ html); El único denominador común para cualquier etiqueta es <y>. Luego, después de eso, generalmente son comillas ("). Puede extraer información tan fácilmente una vez que encuentre el denominador común. Esto es lo que se me ocurrió:

$html = file_get_contents(''http://some_page.html''); $h = explode(''>'', $html); foreach($h as $k => $v){ $v = trim($v);//clean it up a bit if(preg_match(''/^(<script[.*]*)/ius'', $v)){//my regex here might be questionable $counter = $k;//match opening tag and start counter for backtrace }elseif(preg_match(''/([.*]*<//script$)/ius'', $v)){//but it gets the job done $script_length = $k - $counter; $counter = 0; for($i = $script_length; $i >= 0; $i--){ $h[$k-$i] = '''';//backtrace and clear everything in between } } } for($i = 0; $i <= count($h); $i++){ if($h[$i] != ''''){ $ht[$i] = $h[$i];//clean out the blanks so when we implode it works right. } } $html = implode(''>'', $ht);//all scripts stripped. echo $html;

Veo que esto realmente solo funciona para las etiquetas de script porque nunca tendrás etiquetas de script anidadas. Por supuesto, puede agregar fácilmente más código que haga la misma verificación y recopile etiquetas anidadas.

Yo lo llamo codificación de acordeón. implode (); explotar (); son las formas más fáciles de hacer fluir tu lógica si tienes un denominador común.


Un ejemplo que modifica la respuesta de ctf0. Esto solo debería hacer el preg_replace una vez, pero también verificar si hay errores y bloquear el código de char para la barra diagonal.

$str = ''<script> var a - 1; <&#47;script>''; $pattern = ''/(script.*?(?://|&#47;|&#x0002F;)script)/ius''; $replace = preg_replace($pattern, '''', $str); return ($replace !== null)? $replace : $str;

Si está utilizando php 7, puede usar el operador nulo coalesce para simplificarlo aún más.

$pattern = ''/(script.*?(?://|&#47;|&#x0002F;)script)/ius''; return (preg_replace($pattern, '''', $str) ?? $str);


Use el analizador PHP DOMDocument .

$doc = new DOMDocument(); // load the HTML string we want to strip $doc->loadHTML($html); // get all the script tags $script_tags = $doc->getElementsByTagName(''script''); $length = $script_tags->length; // for each tag, remove it from the DOM for ($i = 0; $i < $length; $i++) { $script_tags->item($i)->parentNode->removeChild($script_tags->item($i)); } // get the HTML string back $no_script_html_string = $doc->saveHTML();

Esto me funcionó usando el siguiente documento HTML:

<!doctype html> <html> <head> <meta charset="utf-8"> <title> hey </title> <script> alert("hello"); </script> </head> <body> hey </body> </html>

Solo tenga en cuenta que el analizador DOMDocument requiere PHP 5 o superior.


Yo usaría BeautifulSoup si está disponible. Hace que este tipo de cosas sea muy fácil.

No intentes hacerlo con expresiones regulares. De esa manera yace la locura.


use la función str_replace para reemplazarlos con espacio vacío o algo

$query = ''<script>console.log("I should be banned")</script>''; $badChar = array(''<script>'',''</script>''); $query = str_replace($badChar, '''', $query); echo $query; //this echoes console.log("I should be banned")

?>


$html = <<<HTML ... HTML; $dom = new DOMDocument(); $dom->loadHTML($html); $tags_to_remove = array(''script'',''style'',''iframe'',''link''); foreach($tags_to_remove as $tag){ $element = $dom->getElementsByTagName($tag); foreach($element as $item){ $item->parentNode->removeChild($item); } } $html = $dom->saveHTML();


  • esta es una fusión de ClandestineCoder & Binh WPO .

el problema con las flechas de etiquetas de guiones es que pueden tener más de una variante

ex. (<= &lt; = &amp;lt; ) & (> = &gt; = &amp;gt; )

así que, en lugar de crear una matriz de patrones con una variante similar a la de Bazillion, una mejor solución sería

return preg_replace(''/script.*?//script/ius'', '''', $text) ? preg_replace(''/script.*?//script/ius'', '''', $text) : $text;

esto eliminará todo lo que parezca script.../script independientemente del código / variante de flecha y puede probarlo aquí https://regex101.com/r/lK6vS8/1