1

これが私の文字列です:

$str="<p>Some <a href="#">link</a> with <a href="http://whatever.html?bla">LINK2</a> and <a href="http://whatever.html?bla" target="_blank">LINK3</a> and</p> more html"

php を使用してリンク LINK1 と LINK2 を削除し、以下を取得したいと思います。

"<p>Some <a href="#">link</a> with and and</p> more html"

ここに私が必要なものに近いと思うものがあります:

$find = array("<a(.*)LINK1(.*)</a>", "<a(.*)LINK2(.*)</a>");
$replace = array("", "");
$result=preg_replace("$find","$replace",$str);

これは機能していません。私は何日も検索し、他の多くのオプションを試しましたが、これを期待どおりに機能させることはできませんでした. また、 a タグを外した直後に LINK1 と 2 が出てきてもあまり気になりません。

4

2 に答える 2

1

あなたは実用的な解決策に非常に近づいています。あなたが直面している問題は、デフォルトの正規表現が可能な限り一致しようとすることです。実際、パターンは最初から最後まで<a(.*)LINK1(.*)</a>一致します。あなたが望むのは、最も近いタグを取得することだけです。 <a </a>LINK1<a>

これを行うにはいくつかの方法がありますが、私は通常、一致を貪欲にしないようにします。次に、可能な限り最小の一致を見つけようとします。?これを行う 2 つの方法は、数量詞の後にa を追加するか、 ungreedy 修飾子Uを使用することです。私は最初のものを好みます。

使用?:

/<a(.*?)LINK1(.*?)<\/a>/

修飾子の使用:

/<a(.*)LINK1(.*)<\/a>/U

ここではどちらも同じように機能するはずです。したがって、ソース コード全体は次のようになります ( を使用?)。

$find = array("/<a(.*?)LINK1(.*?)<\/a>/", "/<a(.*?)LINK2(.*?)<\/a>/");
$replace = array("", "");
$result = preg_replace($find, $replace, $str);

そして、ええ、他のコメントで述べたように、HTML コードを操作するために正規表現に頼るべきではありません (式を無視して通過する有効な HTML コードを作成するのは本当に簡単だからです)。ただし、解析する HTML コードを信頼している場合、またはこのマッチングの結果が他の重要な機能にとって重要でない場合は、まったく問題ないと思います。

于 2012-07-28T12:15:53.317 に答える
0

これを試して:

<?php
$str='<p>Some <a href="#">link</a> with <a href="http://whatever.html?bla">LINK2</a> and <a href="http://whatever.html?bla" target="_blank">LINK3</a> and</p> more html';
$find = array("/<a(.*)LINK1(.*)<\/a>/si", "/<a(.*)LINK2(.*)<\/a>/si");
$replace = array("", "");
$result=preg_replace($find, $replace, $str);
于 2012-07-28T12:05:49.463 に答える