Удалите только действительный HTML

Я пытаюсь удалить теги HTML из фрагмента текста. Однако проблема в том, что все, что я использую - регулярное выражение, strip_tags и т. Д., Сталкивается с той же проблемой: он также удаляет текст, который не является HTML, но выглядит так.

Some <[email protected]> Content--> Some Content
Some <Content which looks like this --> Some 

Есть ли способ обойти это?


person Jonathan    schedule 19.07.2013    source источник
comment
Это будет проблемой - действительность тегов зависит от используемой вами разновидности HTML. Что-то допустимое в переходном не будет допустимым в строгом, что-то действительное в html5 будет недействительным в xhtml и так далее.   -  person Mołot    schedule 19.07.2013
comment
Я получаю это от пользовательского ввода. Я хочу удалить все теги, не получая проблем, как указано выше.   -  person Jonathan    schedule 19.07.2013
comment
Вам также приходится иметь дело с людьми, использующими теги HTML в качестве текста. Если вы не разрешаете какой-либо HTML, просто избегайте его, а не пытайтесь удалить.   -  person Quentin    schedule 19.07.2013
comment
Иногда это может прийти как электронное письмо — так что оно может содержать множество ненужных HTML-тегов, таких как стили — экранирование просто сделает его беспорядочным.   -  person Jonathan    schedule 19.07.2013
comment
Но дело в том, что иногда то, что является тегом в одной версии HTML, выглядит как тег в другой. Как вы хотите справиться с этим? Спросить пользователя об издании? а что с xhtml, расширенным с помощью DTD?   -  person Mołot    schedule 19.07.2013
comment
Если это электронное письмо в формате HTML, вы можете просто показать его через анализатор HTML и преобразовать в текст. Вы могли бы даже передать это через рысь.   -  person Quentin    schedule 19.07.2013
comment
Я хочу сделать это только с помощью PHP, поэтому на lynx и на сервере не установлен DOMDocument. Существуют ли другие парсеры PHP?   -  person Jonathan    schedule 19.07.2013


Ответы (2)


Вполне правильным решением будет полноценный парсер HTML. См. этот легендарный вопрос для полного обсуждения.

Простым 80%-ным решением будет поиск всех известных тегов и удаление их.

RegExp('</?(a|b|blockquote|cite|dd|dl|dt|...|u)\b.*?>')

Код будет более читабельным, если вы будете использовать массив тегов и строить выражения по мере их перебора. Он не будет хорошо обрабатывать комментарии, поэтому, если вам нужно нечто большее, чем хакерское качество, не делайте этого с помощью хакерского подхода. Если вам нужна корректность, используйте настоящий парсер HTML (например, DOMDocument в PHP).

person Patrick Fisher    schedule 19.07.2013
comment
Я пробовал это, но затем не получилось ничего, начинающегося с тега, такого как ‹[email protected]› — соответствие тегу html ‹b›. - person Jonathan; 19.07.2013
comment
\b (граница слова) позаботится об этом случае. - person Patrick Fisher; 19.07.2013

Пробовали ли вы использовать библиотеку очистителя HTML? Вы можете настроить его на удаление всех тегов, я нашел библиотеку очень надежной.

person Touh312    schedule 19.07.2013
comment
У меня нет контроля над тем, какие библиотеки я устанавливаю. Так что это мне не подойдет. - person Jonathan; 19.07.2013
comment
@Bonzo: это просто PHP-код. Вы распаковываете его в каталог и добавляете require_once '/path/to/HTMLPurifier.auto.php'; в свой код, чтобы загрузить его. - person Ilmari Karonen; 19.07.2013