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; </script>'';
$pattern = ''/(script.*?(?://|/|/)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.*?(?://|/|/)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;
) & (> =>
=&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