0

このような HTML コードがあるとします。内部にタグを<a href=""></a>含まないすべてのタグを取得する必要があります。img

<a href="http://domain1.com"><span>Here is link</span></a>
<a href="http://domain2.com" title="">Hello</a>
<a href="http://domain3.com" title=""><img src="" /></a>
<a href="http://domain4" title=""> I'm the image <img src="" /> yeah</a>

この正規表現を使用して、すべてのタグ リンクを検索しています。

preg_match_all("!<a[^>]+href=\"?'?([^ \"'>]+)\"?'?[^>]*>(.*?)</a>!is", $content, $out);

次のように変更できます。

preg_match_all("!<a[^>]+href=\"?'?([^ \"'>]+)\"?'?[^>]*>([^<>]+?)</a>!is", $content, $out);

<imgしかし、内部に部分文字列を含む結果を除外するように指示するにはどうすればよい<a href=""></a>ですか?

4

2 に答える 2

3

Simple DOM parserのような HTML パーサーを使用する必要があります。正規表現を使用して HTML を解析することはできません。

于 2010-05-24T10:04:52.247 に答える
2

Dom が進むべき道ですが、興味のためにここに解決策があります:

正規表現で特定の一致を除外する最も簡単な方法は、「否定先読み」または「否定後読み」を使用することです。文字列のどこかに否定的な表現が見つかった場合、一致は失敗します。

例:

^(?!.+<img.+)<a href=\"?\'?.+\"?\'?>.+</a>$

一致:

<a href="http://domain1.com"><span>Here is link</span></a>
<a href="http://domain2.com" title="">Hello</a>

しかし、一致しません:

<a href="http://domain3.com" title=""><img src="" /></a>
<a href="http://domain4" title=""> I'm the image <img src="" /> yeah</a>

否定的な先読みは、文字列の次の部分です。

(?!.+<img.+)

これは、任意の文字の後に <img が続き、その後に任意の文字が続く文字列には一致しないことを示しています。

<a href=\"?\'?.+\"?\'?>.+</a>

残りは、HTML のアンカー タグの一般的な一致です。別の一致式を使用することもできます。

使用状況によっては、開始と終了の ^ $ 文字を省略する必要がある場合があります。

ルックアヘッド/ビハインドの詳細

http://www.codinghorror.com/blog/2005/10/except-matches-with-regular-expressions.html

于 2010-05-24T10:45:18.337 に答える