Regex для соответствия всем тэгам HTML кроме <p>и </p> - PullRequest
21 голосов
/ 27 августа 2008

Мне нужно сопоставить и удалить все теги с помощью регулярного выражения в Perl. У меня есть следующее:

<\\??(?!p).+?>

Но это по-прежнему совпадает с закрывающим тегом </p>. Любой совет о том, как сопоставить с закрывающим тегом?

Обратите внимание, это выполняется в xhtml.

Ответы [ 13 ]

1 голос
/ 27 августа 2008

Предполагая, что это будет работать в PERL, как и в языках, которые утверждают, что используют PERL-совместимый синтаксис:

/<\/?[^p][^>]*>/

EDIT:

Но, к сожалению, это не будет соответствовать тегу <pre> или <param>.

Это, возможно?

/<\/?(?!p>|p )[^>]+>/

Это должно охватывать <p> теги, которые также имеют атрибуты.

0 голосов
/ 27 августа 2008

Вероятно, вам также следует удалить любые атрибуты тега

, так как кто-то плохой может сделать что-то вроде:

<p onclick="document.location.href='http://www.evil.com'">Clickable text</p>

Самый простой способ сделать это - использовать предложенное здесь регулярное выражение для поиска тегов & ltp> с атрибутами и заменить их тегами

без атрибутов. Просто чтобы быть в безопасности.

0 голосов
/ 27 августа 2008

Попробуйте, это должно работать:

/<\/?([^p](\s.+?)?|..+?)>/

Объяснение: оно соответствует либо одной букве, кроме «p», за которой следует дополнительный пробел и несколько символов, либо несколько букв (не менее двух).

/ EDIT: я добавил возможность обрабатывать атрибуты в p тегах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...