RegEx: сопоставление определенной строки, которая не находится внутри тега HTML - PullRequest
4 голосов
/ 03 марта 2010
<tag value='botafogo'> botafogo is the best </tag>

Требуется совпадать только с ботафого (... лучше), а не с 'ботафого'

моя программа автоматически аннотирует термин в чистом тексте:

botafogo is the best 

to

<team attr='best'>botafogo</team> is the best 

и когда я «заменяю все» «лучшим» словом, у меня возникает большая проблема ...

<team attr='<adjective>best</adjective>'>botafogo</team> is the <adjective>best</adjective>

Ps .: язык Java

Ответы [ 5 ]

5 голосов
/ 03 марта 2010

Лучший способ сделать это - НЕ использовать регулярные выражения и не использовать правильный HTML-парсер. HTML не является обычным языком, и делать это с помощью регулярных выражений будет утомительно, сложно поддерживать, и, скорее всего, он все еще будет содержать различные ошибки.

HTML-парсеры, с одной стороны, хорошо подходят для этой работы. Многие из них зрелые и надежные, они заботятся о каждой мелочи для вас и делают вашу жизнь намного проще.

4 голосов
/ 03 марта 2010

Рассматривали ли вы использовать функции DOM вместо регулярных выражений?

document.getElementsByTagName('tag')[0].innerHTML.match('botafogo')
1 голос
/ 03 марта 2010

HTML-парсер лучше, затем просматривайте текстовое содержимое.(См. Другие ответы.)

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

0 голосов
/ 16 января 2012

Я просто искал решение той же задачи и создал решение, которое, похоже, справится с этой задачей.

Отрицательный взгляд - это ключ. Чтобы убедиться, что совпадение не находится внутри тега, посмотрите вперед и убедитесь, что закрывающая угловая скобка не найдена до открывающей. Предположим, мы хотим найти слово «игла»:

#needle(?![^<]+>)#i

Мой случай написан на PHP и выглядит примерно так:

function filter_highlighter($content) {
    $patterns = array(
        '#needle(?![^<]+>)#i',
        '#<b>Need</b>le#',
        '#<strong>Need</strong>le#'
    );
    $replacement = '<span class="highlighted">Need</span>le';
    $content = preg_replace( $patterns, $replacement, $content);
    return $content;
}

Пока это работает.

0 голосов
/ 03 марта 2010

@ OP, на вашем любимом языке выполните разбиение на </tag>, а затем еще раз на >.например, Python

>>> s="<tag value='botafogo'> botafogo is the best </tag>"
>>> for item in s.split("</tag>"):
...  if "<tag" in item:
...      print item.split(">")[-1]
...
 botafogo is the best

Регулярное выражение не требуется

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