2012-01-09 86 views
0

我試圖匹配某個單詞並用某些文本替換部分單詞,但保留單詞的其餘部分不變。這是我的理解,加上小括號的正則表達式模式的一部分意味着括號內的模式匹配被替換當您使用preg_replace()preg_replace()似乎刪除整個單詞而不是它的一部分

用於測試目的我用:

$text = 'batman'; 
echo $new_text = preg_replace('#(bat)man#', 'aqua', $text); 

我只是想「蝙蝠」被'aqua'取代以獲得'aquaman'。相反,$new_text回聲'水',離開了'男人'的一部分。

回答

5

preg_replace替換由正則表達式匹配

$text = 'batman'; 
echo $new_text = preg_replace('#bat(man)#', 'aqua\\1', $text); 

捕捉man,而不是將其追加到你的aqua前綴的所有字符串

這樣做的另一種方法是使用斷言:

$text = 'batman'; 
echo $new_text = preg_replace('#bat(?=man)#', 'aqua', $text); 
3

我不會用preg_*這個功能,只是做str_replace()DOCs

echo str_replace('batman', 'aquaman', $text); 

這更簡單,因爲在這種情況下並不需要正則表達式。否則,這將是一個正則表達式:

echo $new_text = preg_replace('#bat(man)#', 'aqua\\1', $text); 

更換整個搜索短語時,這將取代你的man在後aquapreg_replaceDOCs取代了模式的整個匹配部分。

+0

+1:你是完全正確的,它*是*不需要的。讓我兩次閱讀這個問題來看看;) – hakre 2012-01-09 11:08:47

1

括號正在創建一個捕獲組,這意味着您可以使用\1訪問與該組匹配的零件。

您可以執行zerkms建議操作,也可以使用只查看但不匹配的lookahead。

$text = 'batman'; 
echo $new_text = preg_replace('#bat(?=man)#', 'aqua', $text); 

這將匹配「蝙蝠」,但只有當它後面是「人」,而只有「蝙蝠」將被替換。

2

的方式你要做到這一點,更喜歡它應該是:

preg_replace('#bat(man)#', 'aqua$1', $text); 

我會用positive lookahead

preg_replace('/bat(?=man)/', 'aqua', $text) 

演示在這裏:http://ideone.com/G9F4q