1

かなり長くて複雑な HTML ドキュメントがあり、特定の文字列 (例: "foobar") が<a></a>アンカー タグの間にない限り、出現するすべての文字列を見つける必要があります。

問題は、アンカータグ間のテキスト内にある可能性があることです。

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

この場合でも、一致するものは見つかりません。

どうすれば正規表現でそれを行うことができますか?? 見つけるのに問題はありませんが、アンカータグの間にあり、他の多くのテキストに囲まれている可能性がある場合を除いて<a>foobar</a>、すべての「foobar」を見つけるのは少し難しいようです.....

何か案は??

ANSWER:
この問題を解決するために、この正規表現を使用することになりました。

(?<!\<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 に答える