От perlfaq9: How do I remove HTML from a string?
Самый правильный способ (хотя и не самый быстрый) - использовать HTML :: Parser из CPAN. Другим наиболее правильным способом является использование HTML :: FormatText, который не только удаляет HTML, но и пытается сделать небольшое простое форматирование полученного текстового текста.
Многие люди пытаются использовать простой подход к регулярному выражению, например s/<. *?> // g, но это во многих случаях терпит неудачу, поскольку теги могут продолжаться по разрыву строк, они могут содержать закодированные угловые скобки, или комментарий HTML может присутствовать. Кроме того, люди забывают конвертировать объекты - например, <.
Вот один «простодушный» подход, который работает для большинства файлов:
#!/usr/bin/perl -p0777
s/<(?:[^>'"]*|(['"]).*?\1)*>//gs
Если вы хотите получить более полное решение, увидеть программу striphtml 3 этапа в http://www.cpan.org/authors/id/T/TO/TOMC/scripts/striphtml.gz.
Вот некоторые сложные случаи, которые вы должны думать о том, выбирая решение:
<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 [ >>>>>>>>>>>> ]]>
Если комментарии HTML включают в себя другие теги, эти решения также сломаться по тексту, как это:
<!-- This section commented out.
<B>You can't see me!</B>
-->
Я бы не сказал, мог бы, я бы сказал, должен. Пытаться дезинформировать HTML с помощью регулярных выражений абсурдно в этот день и в возрасте. Используйте один из многочисленных HTML-санирующих модулей из CPAN, желательно что-то предназначенное для предотвращения уязвимостей XSS и не написанное Дэниелом Мьюи. – 2009-07-02 10:52:04
Остерегайтесь HTML :: Strip неправильно поддерживает кодированные строки UTF-8.См. Здесь обход https://gist.github.com/910818 – nick