2012-01-10 92 views
1

我寫預浸比賽規則:預浸匹配,更換URL來設置高亮

$subject = 'text <a href="http://google.com">LINK</a> text text <a href="http://google2.com">LINK2</a>'; 

$search = array(
    '/\<a href\="(.*)\">(.*)\<\/a\>/i' 
); 

$replace = array(
    "[a href=\"$1\"]$2[/a]" 
); 

echo preg_replace($search, $replace, $subject); 

當文本只有一個鏈接一切都很正常,然後不止一個 - 當crach代碼

這我得到更多的多於一個的鏈路: 「文本[A HREF =」 http://google.com 「> LINK文本文本」

回答

2

更改爲'/\<a href\="(.*?)\">(.*?)\<\/a\>/i'使匹配不可─貪婪

0

這裏有一個更好的正則表達式 - 它在標籤額外領域涉及:

\<a (?:.*?)href\=[\"\']([^\"\']+?)[\"\'][^\>]*?\>(.+?)\<\/a\> 

我想我已經逃脫了所有的特殊字符在那裏,我不知道PHP認爲有什麼「特殊」 ,但基本上這應該符合以下所有:

$subject = 'text <a id="test" href="http://google.com">LINK</a> text text <a href="http://google2.com" id="test">LINK2</a> text <a href="http://google3.com">LINK3</a>'; 

另外,我不知道PHP,但匹配在Perl多個環節,需要對正則表達式的末尾/ g的改性劑,所以:

$search = array(
     '/\<a (?:.*?)href\=[\"\']([^\"\']+?)[\"\'][^\>]*?\>(.+?)\<\/a\>/ig' 
); 

將作爲您的搜索。也許preg_replace已經這樣做了,但我會很驚訝,因爲有時候你只想替換目標文本中的一個實例。