регулярное выражение:сопоставлять строку только в том случае, если она не является частью тега

StackOverflow https://stackoverflow.com/questions/1366481

Вопрос

Я пытаюсь сопоставить строку, только если она не является частью 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/^<.*//

То, с чем вы остаетесь, - это просто текст (и, возможно, много пробелов).Хотя здесь речь идет не столько о регулярных выражениях, сколько о поиске и замене.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top