Elimine todas las etiquetas html y el contenido, excepto una clase div

Quiero eliminar todo el contenido html de una cadena excepto una clase div: <div class="toto">blablabla</div>

¿Debo usar un analizador de expresiones regulares o DOM?

Para responder drachenstern:

Es un contenido de comentario con bbcode. Y el html en este div se genera con Geshi (resaltador de código), por lo que no quiero eliminar esto.

Por ejemplo, un visitante puede ingresar <script></script> en un parche de [code][/code] etiqueta bbcode. Todo HTML fuera del [code][/code] La etiqueta bbcode debe eliminarse, ¿no?

preguntado el 09 de enero de 11 a las 06:01

5 Respuestas

Es casi imposible usar una expresión regular para extraer con éxito datos de una página web por lo que sugeriría en su lugar usar un analizador HTML dedicado. Algunos problemas son demasiado grandes para que intente abordarlos en todo momento, por lo que se considera correcto y aceptable para usar una biblioteca externa.

Si solo necesita un div, me gustaría saber qué está tratando de hacer con el div en particular. ¿Puede funcionar en el lado del cliente o debe suceder en el servidor? ¿Estás intentando escribir un raspador?

contestado el 23 de mayo de 17 a las 15:05

Es un contenido de comentario con bbcode. Y el html en este div se genera con Geshi (resaltador de código), por lo que no quiero eliminar esto. Por ejemplo, un visitante puede ingresar en una etiqueta bbcode [código] [/ código] pero no fuera. Perdón por mi mal ingles :/ - CrazyMax

Tu inglés no es malo y todavía no estoy del todo seguro de cuál es el problema. ¿Está filtrando la entrada en una publicación de formulario y tratando de evitar XSS antes de devolver elementos a la página? - jcolebrand

Sí, utilicé PHP IDS para evitar la inyección y Akismet para el spam. - CrazyMax

@crazy ¿Por qué no está utilizando campos de formulario y analizando el campo de formulario? - jcolebrand

Creo que ya sabes la respuesta :-)

Aunque en serio ... en este caso depende de la complejidad de la cadena circundante ... Si tiene una gran variación o el fragmento que desea mantener está anidado profundamente, entonces un analizador de dom hace sonse ... si el contenido circundante es bonito predecible, entonces una expresión regular puede ser suficiente. Probablemente usaría el DOM de cualquier manera porque será más fácil trabajar con él y será el más seguro.

Respondido el 09 de enero de 11 a las 09:01

A menos que pueda garantizar que esta sección de la cadena tiene EXACTAMENTE la forma <div class="toto".....</div>, regex no puede hacerlo. Con exactamente me refiero principalmente a ningún otro atributo antes class y no otro div elemento dentro de este. La expresión regular debe poder manejar mayúsculas / minúsculas, espacios en blanco y comillas simples / dobles.

Dado que probablemente no pueda hacer esas garantías (sería un caso excepcional si pudiera), necesita un analizador DOM

Incluso si hace que las expresiones regulares funcionen para este caso muy específico, si va a tener posibles cambios o realizar tareas similares en otro lugar, entonces el analizador DOM rápidamente valdrá la pena.

EDITAR: había categorizado erróneamente los espacios en blanco, corregido.

Respondido el 09 de enero de 11 a las 09:01

(Supongo de la etiqueta PHP que lo siguiente sería útil ...)

strip_tags () hace exactamente esto. El código de muestra

<?php
$text = '<p>Test paragraph.</p> <div class="blah">Other text</div>';

echo strip_tags($text, '<div>');
echo "\n";
?>

produce la salida

Test paragraph. <div class="blah">Other text</div>

Respondido el 09 de enero de 11 a las 09:01

No quiero el contenido, quiero eliminar todas las etiquetas HTML fuera de [código] [/ código] - CrazyMax

Muy bien, entendí mal la pregunta. - metadaddy

wordpress y otros todavía usan kses y parece ser un filtro bastante flexible; échale un vistazo aquí: http://sourceforge.net/projects/kses/

Ejemplo:

$string = kses($string, array('div' => array('valueless' => 'n', value => 'toto')));

Respondido el 09 de enero de 11 a las 10:01

Intenté kses pero es solo 'strip_tags' y no elimino el contenido :( - CrazyMax

solo debería suceder si no pasa $ allowed_html (el segundo argumento) - agregué un ejemplo a esta publicación ... - romano

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.