De perlfaq9: How do I remove HTML from a string?
La forma más correcta (aunque no la más rápida) es usar HTML :: Parser desde CPAN. Otra forma, en su mayoría correcta, es utilizar HTML :: FormatText, que no solo elimina HTML sino que también intenta hacer un pequeño formateo simple del texto sin formato resultante.
Mucha gente intenta un enfoque de expresión regular simple, como s/<. *?> // g, pero eso falla en muchos casos porque las etiquetas pueden continuar sobre saltos de línea, pueden contener corchetes angulares entrecomillados, o comentario HTML puede estar presente. Además, la gente se olvida de convertir entidades, como <, por ejemplo.
Aquí es uno de los enfoques "ingenuo", que funciona para la mayoría de los archivos:
#!/usr/bin/perl -p0777
s/<(?:[^>'"]*|(['"]).*?\1)*>//gs
Si desea una solución más completa, ver el programa striphtml de 3 etapas en http://www.cpan.org/authors/id/T/TO/TOMC/scripts/striphtml.gz.
Éstos son algunos casos difíciles que usted debe considerar cuando se escoge una solución:
<IMG SRC = "foo.gif" ALT = "A > B">
<IMG SRC = "foo.gif"
ALT = "A > B">
<!-- <A comment> -->
<script>if (a<b && a>c)</script>
<# Just data #>
<![INCLUDE CDATA [ >>>>>>>>>>>> ]]>
Si los comentarios HTML incluyen otras etiquetas, esas soluciones también rompería el texto como este:
<!-- This section commented out.
<B>You can't see me!</B>
-->
No diría que podría, diría que debería. Intentar desinfectar HTML con expresiones regulares es absurdo en este día y edad. Utilice uno de los numerosos módulos de desinfección de HTML del CPAN, preferiblemente algo diseñado para evitar vulnerabilidades de XSS y no escrito por Daniel Muey. –
Cuidado con HTML :: Strip no admite correctamente cadenas codificadas en UTF-8.Consulte aquí para obtener una solución alternativa https://gist.github.com/910818 – nick