PHP htmlentities () sem converter tags html

Encontrei alguns posts que se referem ao problema, mas nenhum deles o resolve totalmente.

Eu preciso da function que emitirá o conteúdo convertendo todos os caracteres especiais da forma como htmlentities (), mas preservando todas as tags html.

Eu tentei muitas abordagens diferentes, mas como mencionei acima – nenhum deles funciona como esperado.

Eu estava pensando se haveria uma maneira de fazê-lo usando a class PHP DomDocument.

Eu tentei fazê-lo usando o seguinte:

$objDom = new DOMDocument('1.0', 'utf-8'); $objDom->loadhtml($content); return $objDom->savehtml(); 

que funciona, mas também adiciona toda a estrutura da página, ou seja,

  etc. 

Eu só preciso do conteúdo da variável de $ content para ser convertido e trabalho feito.

Outra coisa que vale a pena mencionar aqui é que o conteúdo de $ também pode ter alguns caracteres convertidos para xhtml queixa – como vem de Wysiwyg. Por isso, pode conter e etc., o que também deve ser preservado.

Alguém sabe a maneira de fazê-lo com o DomDocument – talvez eu deva usar o método Save diferente?

Ok – Eu vim com o seguinte – não é excelente, mas o local de trabalho é:

 $objDom = new DOMDocument('1.0', 'UTF-8'); $objDom->loadHTML($string); $output = $objDom->saveXML($objDom->documentElement); $output = str_replace('', '', $output); $output = str_replace('', '', $output); $output = str_replace('
', '', $output); return $output; 

Todas as idéias melhores seriam muito apreciadas.

Você pode usar get_html_translation_table e remover os itens < e > :

 $trans = get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES); unset($trans['<'], $trans['>']); $output = strtr($input, $trans); 

get_html_translation_table (HTML_ENTITIES) fornece a tabela de tradução usada em htmlentities () como uma matriz. Você pode remover <,> e “da matriz como assim:

 "]); $str = "Hallo & Frau & Krämer"; $encoded = strtr($str, $trans); echo $encoded; ?> 

Deixe-me começar por dizer que, na minha opinião, o que você está tentando fazer é fundamentalmente errado. E se alguém quiser digitar um sinal de menos que? Pessoalmente, vejo htmlentities() como uma maneira de garantir que os usuários não possam inserir seu próprio código HTML.

Se você precisa que os usuários possam escrever texto, há muitas soluções já feitas para isso (veja TinyMCE ou Markdown , por exemplo).

Se você deve permitir aos usuários inserir tags HTML, e você deve assumir que eles não sabem como usar entidades, aqui está uma function simples que funciona:

 function my_htmlentities ($str) { // We'll append everything to this. $result = ''; // Continue while there are HTML tags. while (($lt = strpos($str, '<')) !== false) { // Run `htmlentities` on everything before the tag, and pop it // off the original string. $result .= htmlentities(substr($str, 0, $lt)); $str = substr($str, $lt); // We want to continue until we reach the end of the tag. I know // these loops are bad form. Sorry. I still think in F77 :p while (true) { // Find the closing tag as well as quotes. $gt = strpos($str, '>'); $quot = strpos($str, '"'); // If there is no closing bracket, append the rest of the tag // as plaintext and exit. if ($gt === false) return $result . $str; // If there is a quote before the closing bracket, take care // of it. if ($quot !== false && $quot < $gt) { // Grab everything before the quote. $result .= substr($str, 0, $quot+1); $str = substr($str, $quot+1); // Find the closing quote (if there is none, append and // exit). if (($quot = strpos($str, '"')) === false) return $result . $str; // Grab the inside of the quote. $result .= substr($str, 0, $quot+1); $str = substr($str, $quot+1); // Start over as if we were at the beginning of the tag. continue; } // We just have the closing bracket to deal with. Deal. $result .= substr($str, 0, $gt+1); $str = substr($str, $gt+1); break; } } // There are no more tags, so we can run `htmlentities()` on the // rest of the string. return $result . htmlentities($str); // Alternatively, if you want users to be able to enter their own // entities as well, you'll have to use this last line instead: return str_replace('&', '&', $result . htmlentities($str)); } 

Por favor, deixe-me reiterar: isso é extremamente inseguro! Eu lhe darei o benefício da dúvida de que você sabe o que deseja, mas acho que você (ou qualquer um) deve querer isso.

Ok – depois de muita pesquisa, encontrei a opção final – que parece ser exatamente o que eu precisava.

Usei o HTMLPurifier e filtrei meu conteúdo usando o seguinte:

 require_once('HTMLPurifier/HTMLPurifier.auto.php'); $config = HTMLPurifier_Config::createDefault(); $config->set('HTML.Doctype', 'XHTML 1.0 Transitional'); $objPurifier = new HTMLPurifier($config); return $objPurifier->purify($string); 

Espero que alguém a ache que seja útil.