5

ページを変数に読み込んでいますが、アドレスに「remedy」という単語が含まれていないすべてのリンクを無効にしたいと考えています。私がこれまでに持っているコードは、「救済」のあるものを含むすべてのリンクを取得します。私は何を間違っていますか?

$page = preg_replace('~<a href=".*?(?!remedy).*?".*?>(.*?)</a>~i', '<font color="#808080">$1</font>', $page);

- 解決 -

$page = preg_replace('~<a href="(.(?!remedy))*?".*?>(.*?)</a>~i', '<font color="#808080">$2</font>', $page);
4

2 に答える 2

3

試す~<a href="(.(?!remedy))*?".*?>(.*?)</a>~i

質問に対して、あなたが間違っていること:正規表現は可能な限り一致し、各URL( を含むものであってもremedy)は一致'~<a href=".*?(?!remedy).*?".*?>(.*?)</a>~i'するremedy可能性があります.*?remedy/nothing ( ) が後に続かないものであり、正確に で始まる URL を除くすべての URL に当てはまります<a href="remedy"。それを理解できることを願っています...

于 2013-05-12T21:50:56.853 に答える
1

私はおそらくこれを使用します:

<a href="(?:(?!remedy)[^"])*"[^>]*>([^<]*)</a>

最も興味深い部分は次のとおりです。

"(?:(?!remedy)[^"])*"

が別の文字を消費しようとするたび[^"]に、先読みに屈して、それが単語の最初の文字ではないことを確認しますremedy[^"]代わりに使用.すると、終了引用符を超えて何も表示されなくなります。また、あなた.*?の s を否定された文字クラスに自由に置き換えることもできました。これは同じ目的を果たし、一致させたい領域で一致を「囲い込み」ます。また、より効率的で堅牢です。

もちろん、<a>要素のコンテンツはプレーン テキストであり、内部に要素がネストされていないと想定しています。実際、これは私が立てた多くの単純化された仮定の 1 つにすぎません。それらがなければ、HTML を正規表現と照合することはできません。

于 2013-05-12T23:27:08.390 に答える