我在使用 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 进行同样的操作,但这给了我相同的输出。
答案 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到rooms
。roomID
(2次)
更改$ match和$ replace表的顺序以获得预期结果
$match = array('r_rooms.roomID','rooms.roomID');
$replace = array('`r_rooms`.`roomID`','`rooms`.`roomID`');