1

我有一个相当长和复杂的 HTML 文档,我需要找到给定字符串的所有出现,例如“foobar”,除非它在<a></a>锚标记之间。

问题是:它可能在锚标签之间的一些文本中,例如

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

即使在这种情况下,我也不应该找到匹配项。

我怎么能用正则表达式做到这一点?我会很容易找到<a>foobar</a>等等 - 但是找到每个“foobar” ,除非它位于锚标签之间并且被可能的很多其他文本包围,这似乎有点棘手......

有任何想法吗??

回答:
我们最终使用这个正则表达式来解决这个问题——以防万一有人a)好奇,或者b)在同一个地方:-)

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

3 回答 3

2
'foobar(?![^<]*</a>)'

在最简单的情况下对我有用。它显然不反对在标签中包含其他a标签。

于 2009-10-02T14:30:27.743 回答
1

您应该能够使用负前瞻和后视模式。这是一个很好的教程:

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

于 2009-10-02T14:27:46.717 回答
0

试试这个:

$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);
于 2009-10-02T14:35:44.147 回答