регулярное выражение:сопоставлять строку только в том случае, если она не является частью тега
-
21-09-2019 - |
Вопрос
Я пытаюсь сопоставить строку, только если она не является частью html-тега.
Например, при поиске строки:"азбука".<a href="foo.html">abc def</a>
должно соответствовать
<p> foo bar foo abc foo bar</p>
должно соответствовать
но
<a href="abc.html">foo</a>
не должно совпадать.
Спасибо за помощь!
Решение
Я бы действительно не стал использовать регулярные выражения для сопоставления с HTML, поскольку HTML не является регулярным, и существует множество крайних случаев, которые могут сбить вас с толку.Для всех, кроме самый простой случаи, когда я бы использовал HTML-анализатор (например этот для PHP).
Другие советы
В любом случае, Брайан прав: если вы хотите использовать регулярное выражение, то оно вам подходит.:
.*>[^<]*abc[^<]*<.*
Я совершенно убежден, что любое регулярное выражение приведет к разрыву в некоторых разделах CDATA.
То, что вы ищете, - это анализатор DOM.Это удалит весь HTML-код и предоставит вам обычный текст просматриваемой страницы, с которым вы затем сможете сопоставить.Не уверен, каков ваш вариант использования, но я не предполагаю, что вы не манипулируете DOM, иначе вы бы использовали JavaScript.
Если вы просто извлекаете информацию, проанализируйте страницу, используя что-то вроде Простой синтаксический анализатор HTML DOM, а затем сопоставьте с обычным текстом, который вы можете получить из анализируемого объекта.
Хотя я тоже согласен с Брайан's Комментарий, я часто выполняю быстрый и грязный синтаксический анализ с помощью регулярных выражений, и в вашем случае я бы использовал что-то вроде этого:
- "сериализовать" данные
s/[\r\n]// s/<!\[CDATA\[.*?]]>// s/</\n</ s/>/>\n/
- затем просто отфильтруйте все строки, которые начинаются с
<
s/^<.*//
То, с чем вы остаетесь, - это просто текст (и, возможно, много пробелов).Хотя здесь речь идет не столько о регулярных выражениях, сколько о поиске и замене.