remova a etiqueta do script do conteúdo HTML

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

Eu só quero remover tags . Não quero remover a formatação inline ou qualquer outra coisa.

Como posso conseguir isso?

Mais uma coisa, existe uma outra maneira de remover tags de script do HTML

Porque esta questão é marcada com a regex , vou responder com a solução do pobre homem nesta situação:

 $html = preg_replace('##is', '', $html); 

No entanto, expressões regulares não são para a análise de HTML / XML, mesmo que você escreva a expressão perfeita que irá quebrar eventualmente, não vale a pena, embora, em alguns casos, seja útil corrigir rapidamente algumas margens e, como está em soluções rápidas, esquecer a segurança . Use o regex apenas no conteúdo / marcação em que confia.

Lembre-se, qualquer coisa que as inputs de usuários devem ser consideradas não seguras .

Uma melhor solução aqui seria usar o DOMDocument projetado para isso. Aqui está um trecho que demonstra como é fácil, limpo (em comparação com regex), (quase) confiável e (quase) seguro é fazer o mesmo:

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

Eu removi o HTML intencionalmente porque mesmo isso pode bork .

Use o analisador 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(); 

Isso me funcionou usando o seguinte documento HTML:

 < !doctype html>     hey     hey   

Basta ter em mente que o analisador DOMDocument requer PHP 5 ou superior.

Eu usaria o BeautifulSoup se estiver disponível. Isso torna esse tipo de coisa muito fácil.

Não tente fazê-lo com regexps. Desta forma, é uma loucura.

Eu estava lutando com essa questão. Eu descobri que você realmente precisa apenas de uma function. explodir (‘>’, $ html); O único denominador comum para qualquer tag é . Então, depois disso, geralmente são aspas (“). Você pode extrair informações tão facilmente, uma vez que você encontra o denominador comum. Isto é o que eu criei:

 $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('/^( 

Vejo que isso realmente só funciona para tags de script porque você nunca terá tags de script aninhadas. Claro, você pode facilmente adicionar mais código que faz a mesma verificação e coletar tags aninhadas.

Eu chamo de codificação de acordeão. implodir (); explodir (); são as maneiras mais fáceis de obter sua lógica fluindo se você tiver um denominador comum.

Mais curta:

$html = preg_replace("/

Ao fazer coisas regex pode dar errado, por isso é mais seguro fazer assim:

$html = preg_replace("/

Então, quando o “acidente” acontece, obtemos o $ html original em vez de uma string vazia.

  • Esta é uma fusão de ClandestineCoder & Binh WPO .

O problema com as setas do script é que eles podem ter mais de uma variante

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

então em vez de criar uma matriz de padrões com uma variante de bazillion, uma solução melhor seria

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

Isso removerá qualquer coisa que pareça script.../script independentemente do código / variante de seta e você pode testá-lo aqui https://regex101.com/r/lK6vS8/1

Um exemplo que modifica a resposta do ctf0. Isso só deve fazer o preg_replace uma vez, mas também verifique se há erros e bloqueie o código de caracteres para barra direta.

 $str = ' 

Se você estiver usando o php 7, você pode usar o operador de coalesce nulo para simplificar ainda mais.

 $pattern = '/(script.*?(?:\/|/|/)script)/ius'; return (preg_replace($pattern, '', $str) ?? $str); 

Esta é uma variante simplificada da resposta 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(); } 

Pode ser usado para remover qualquer tipo de tag, incluindo :

 $scriptlessHtml = removeTags($html, 'script'); 
 $html = < <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();