2013-05-14 61 views
1

我在嘗試自動在表名和字段名周圍添加反引號時遇到了str_replace的一些問題。str_replace與字符串的不正確部分匹配

假設我有以下陣列:

$match = array('rooms.roomID','r_rooms.roomID'); 
$replace = array('`rooms`.`roomID`','`r_rooms`.`roomID`'); 
$subject = 'rooms.roomID = r_rooms.roomID'; 

str_replace($match,$replace,$subject); 

,我想到的是結果:

`rooms`.`roomID` = `r_rooms`.`roomID` 

但是,相反,我得到這個:

`rooms`.`roomID` = r_`rooms`.`roomID` 

但是如果我更改r_roomsr_ooms,我的結果如預期

`rooms`.`roomID` = `r_ooms`.`roomID` 

我試過同一precedure,使用了preg_replace,但是這給了我同樣的輸出以及。

+2

或者切換的值的順序('rooms.roomID'是r_rooms.roomID'的'一部分,所以應該來稍後),或者用字邊界('\ b')做一個圍繞它的'preg_replace'。 – Wrikken 2013-05-14 17:13:49

回答

1

這是正確的。首先替換的值是rooms.roomID至roomsroomID(2次)$匹配的 更改訂單和$替換表來獲得期望的結果

$match = array('r_rooms.roomID','rooms.roomID'); 
$replace = array('`r_rooms`.`roomID`','`rooms`.`roomID`'); 
3

快速修復將是重新排序$match$replace陣列像這樣...

$match = array('r_rooms.roomID', 'rooms.roomID'); 
$replace = array('`r_rooms`.`roomID`', '`rooms`.`roomID`'); 

原來辦法的問題是,由元件str_replace過程$match陣列元件,在每一個步驟試圖覆蓋整個串 - 並立即替換找到的零件

作爲rooms.roomID字符串'匹配'[rooms.roomID]r_[rooms.roomID],並相應地替換這些,第二次迭代將無所事事。


正如我所說,這只是一個快速修復。在這種情況下,我會嘗試使用preg_replace,而不是圍繞使用\b(字邊界錨)的實際搜索。

然後再次,在所有應有的尊重,我聞到XY問題在這裏。你不是想爲quoteIdentifier製作你自己的套路嗎?這已經解決了(並在這裏問了很多次)。

+0

非常感謝,它做到了! - 但我想我會用Wrikken的解決方案,使用preg_replace並用詞邊界將它包圍 – 2013-05-14 17:20:11

+0

我可能是,我只是不知道它被稱爲 - 再次感謝! – 2013-05-14 17:26:26