1

在尝试自动在表名和字段名周围放置反引号时,我遇到了一些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,但这也给了我相同的输出。

4

2 回答 2

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吗?这已经解决了(并在这里问了很多次)。

于 2013-05-14T17:12:58.610 回答
1

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

$match = array('r_rooms.roomID','rooms.roomID');
$replace = array('`r_rooms`.`roomID`','`rooms`.`roomID`');
于 2013-05-14T17:13:34.007 回答