2012-01-30 160 views
3

我試圖用不同的URL替換大字符串中的所有鏈接href。使用下面的代碼它似乎只取代第二個鏈接離開第一個完好無損,有人可以幫我嗎?使用PHP preg_replace更改html鏈接的href屬性

$string_of_text = '<a href="http://www.php.net/">PHP</a> <a href="http://www.apache.org/">Apache</a>'; 
echo preg_replace('/<a(.*)href="(.*)"(.*)>/','<a$1href="javascript:alert(\'Test\');"$3>',$string_of_text); 
+1

請修復您的問題標題以描述問題。看看我評論右側「相關」面板中的所有垃圾,並且不要添加到它。 :) – 2012-01-30 00:40:46

+1

使用HTML解析器可能更容易。 – 2012-01-30 00:40:50

+1

大聲笑,我很抱歉Lightness Races in Orbit,我無法在任何地方看到編輯按鈕,但是我會確定我的下一個問題更詳細 – Joe 2012-01-30 00:45:28

回答

11

而不是任何字符.使用任何不(^)報價[^"]

echo preg_replace('/<a(.*)href="([^"]*)"(.*)>/','<a$1href="javascript:alert(\'Test\');"$3>',$string_of_text); 
+0

你把它放在錯誤的地方。 – mowwwalker 2012-01-30 00:42:54

+0

@Walkerneo謝謝,糾正了我的答案。 (過去的午夜。) – 2012-01-30 00:53:24

+0

@JoopEggen,我有幾乎相似的問題。我有一個包含id params的鏈接數組,以及另一個id數組。我想要替換第二個數組中具有相同ID的第一個數組的所有鏈接的href屬性....對於我的語法,如果不正確,請對不起! – Haris 2014-08-12 05:34:12

5

只需使用貪婪運營商在你的正則表達式是這樣的:

'/<a(.*?)href="(.*?)"(.*?)>/' 

它的工作原理,你可以在這裏看到:http://ideone.com/WbVd0

+0

正是我需要的,謝謝:) – Joe 2012-01-30 00:44:07

+1

爲什麼這個答案不被接受? :| – Yash 2013-10-31 14:52:28

0

稍微修改金relio De Rosa的回答:

'/<a(.*?)href=(["\'])(.*?)\\2(.*?)>/i'