str_replace匹配字符串的不正确部分

时间:2013-05-14 17:10:15

标签: php preg-replace 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_rooms 更改为 r_ooms ,我的结果将符合预期

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

我尝试使用 preg_replace 进行同样的操作,但这给了我相同的输出。

2 个答案:

答案 0 :(得分: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制定自己的例程?这已经解决了(这里问过很多次)。

答案 1 :(得分:1)

这是对的。首先替换的值是rooms.roomID到roomsroomID(2次) 更改$ match和$ replace表的顺序以获得预期结果

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