php
  • regex
  • 2013-03-05 194 views 2 likes 
    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倍相同的文本和鏈接改變一個接一個:每次更換隻有一個鏈接 - 因爲我使用的foreach,我知道了。 但我不知道如何一次全部替換它們。 你的幫助會很棒!

    回答

    2

    你不使用html上的正則表達式。改爲使用DOM。如此說來,你的錯誤是在這裏:

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

    你永遠不更新$文本,讓你不斷地對垃圾循環的每次迭代更換。你可能想

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

    代替,這樣的變化「傳播」

    +0

    哈!究竟。感謝那。我浪費了太多時間,就像我想看起來似乎很奇特的名字! :) – 2013-03-05 14:59:31

    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; 
    } 
    
    相關問題