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

Php str_replace匹配字符串的不正确部分,php,preg-replace,str-replace,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); 我预期的结果

当我试图在表名和字段名周围自动加上反勾号时,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`
然而,如果我把休息室改成休息室,我的结果和预期的一样

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

我尝试过同样的方法,使用preg_replace,但这也给了我同样的输出。

快速修复方法是像这样重新排列$match和$replace数组

$match = array('r_rooms.roomID', 'rooms.roomID');
$replace = array('`r_rooms`.`roomID`', '`rooms`.`roomID`');
原始方法的问题是str_replace在每个步骤中逐个元素处理$match数组元素,试图覆盖整个字符串,并立即替换找到的部分

由于rooms.roomID字符串“匹配”了[rooms.roomID]和[rooms.roomID],并相应地替换了这两个字符串,因此第二次迭代将没有任何作用

正如我所说,这只是一个快速解决办法。在本例中,我将尝试使用preg_replace,使用\b单词边界锚围绕实际搜索


再一次,恕我直言,我闻到这里有问题。你不是在为quoteIdentifier做自己的例行公事吗?这个问题已经解决了,并且在这里被问了很多次。

快速修复方法是重新排序$match和$replace数组,如下所示

$match = array('r_rooms.roomID', 'rooms.roomID');
$replace = array('`r_rooms`.`roomID`', '`rooms`.`roomID`');
原始方法的问题是str_replace在每个步骤中逐个元素处理$match数组元素,试图覆盖整个字符串,并立即替换找到的部分

由于rooms.roomID字符串“匹配”了[rooms.roomID]和[rooms.roomID],并相应地替换了这两个字符串,因此第二次迭代将没有任何作用

正如我所说,这只是一个快速解决办法。在本例中,我将尝试使用preg_replace,使用\b单词边界锚围绕实际搜索


再一次,恕我直言,我闻到这里有问题。你不是在为quoteIdentifier做自己的例行公事吗?这已经解决了,并且在这里被问了很多次。

这是正确的。第一个替换的值是rooms.roomID到rooms.roomID的2倍 更改$match和$replace表的顺序以获得预期结果

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

这是正确的。第一个替换的值是rooms.roomID到rooms.roomID的2倍 更改$match和$replace表的顺序以获得预期结果

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

切换值rooms.roomID是r_rooms.roomID的一部分,所以应该稍后出现,或者使用单词边界对其进行预替换\b.切换值rooms.roomID的顺序是r_rooms.roomID的一部分,所以应该稍后出现,或者使用单词边界对其进行预替换\b.谢谢大家,成功了但是我想我会使用Wrikken的解决方案,使用preg_替换并用boundariesI可能是,我只是不知道它被称为-再次感谢!非常感谢,成功了但是我想我会使用Wrikken的解决方案,使用preg_替换并用boundariesI可能是,我只是不知道它被称为-再次感谢!