2

各リンクのテキストを置き換えるのに苦労しています。

$reg_ex = "/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";

$text = '<br /><p>this is a content with a link we are supposed to <a href="http://www.google.com">click</a></p><p>another - this is a content with a link we are supposed to <a href="http://www.amazon.com">click</a></p><p>another - this is a content with a link we are supposed to <a href="http://www.wow.com">click</a></p>';

if(preg_match_all($reg_ex, $text, $urls))
{

    foreach($urls[0] as $url)
    {

        echo $replace = str_replace($url,'http://www.sometext'.$url,  $text);
    }

}

上記のコードから、同じテキストが 3 倍になり、リンクが 1 つずつ変更されます。毎回、リンクが 1 つだけ置き換えられます。なぜなら、foreach を使用しているためです。しかし、それらを一度に置き換える方法がわかりません。あなたの助けは素晴らしいでしょう!

4

2 に答える 2

2

HTMLで正規表現を使用しません。代わりにDOMを使用してください。そうは言っても、あなたのバグはここにあります:

$replace = str_replace(...., $text);
^^^^^^^^---                  ^^^^^---

$text を更新することはないため、ループの反復ごとに置換を継続的に破棄します。あなたはおそらくしたいです

$text = str_replace(...., $text);

代わりに、変更が「伝播」する

于 2013-03-05T14:48:49.307 に答える
1

最終変数にすべての置換を含める場合は、次のように変更します...基本的に、置換された文字列を「件名」に戻していません。質問を理解するのが少し難しいので、それはあなたが期待していることだと思います。

$reg_ex = "/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";

$text = '<br /><p>this is a content with a link we are supposed to <a href="http://www.google.com">click</a></p><p>another - this is a content with a link we are supposed to <a href="http://www.amazon.com">click</a></p><p>another - this is a content with a link we are supposed to <a href="http://www.wow.com">click</a></p>';

if(preg_match_all($reg_ex, $text, $urls))
{
    $replace = $text;
    foreach($urls[0] as $url) {

        $replace = str_replace($url,'http://www.sometext'.$url,  $replace);
    }

    echo $replace;
}
于 2013-03-05T14:56:27.007 に答える