Regex challenge - найдите «foobar» в HTML-документе - PullRequest
1 голос
/ 02 октября 2009

У меня довольно длинный и сложный HTML-документ, и мне нужно найти все вхождения данной строки, например, "foobar", если он не находится между <a> и </a> тегами привязки.

Проблема в том, что он может быть внутри некоторого текста между тегами привязки, например

<a>this is a foobar test</a>

и даже в этом случае я должен не найти совпадение.

Как я могу сделать это с помощью регулярных выражений ?? У меня не было бы проблем с поиском <a>foobar</a> и т. Д. - но найти каждый «foobar» , за исключением , когда он находится между тегами привязки и окружен возможным, много другого текста кажется немного сложным .....

Есть идеи ??

ОТВЕТ:
Мы решили использовать это регулярное выражение для решения этой проблемы - на всякий случай, если кому-то а) интересно, или б) в том же месте: -)

(?<!\<A.*(?=\<\/A))Test(?!\<\/A.*(?=\<A))

Ответы [ 3 ]

2 голосов
/ 02 октября 2009
'foobar(?![^<]*</a>)'

у меня работает в простейшем случае. очевидно, что он не устойчив к наличию других тегов в теге a.

1 голос
/ 02 октября 2009

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

http://www.regular -expressions.info / lookaround.html

0 голосов
/ 02 октября 2009

Попробуйте это:

$str = 'foobar <a>this is a foobar <span>foobar</span> test</a> foobar';

$pattern = '<a(?:[^"\'>]+|"[^"]*"|\'[^\']*\')*>(?:[^<]+|(?!<\/a\s*>)<)*<\/a\s*>';
$parts = preg_split('/('.$pattern.')/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
$isLink = (bool) preg_match('/^'.$pattern.'$/', $parts[0]);
foreach ($parts as &$part) {
    if (!$isLink) {
        $part = str_replace('foobar', '!!!found!!!', $part);
    }
    $isLink = !$isLink;
}
$str = implode('', $parts);

echo htmlspecialchars($str);
...