preg_replace_callback正则表达式语法不正确

时间:2016-05-16 21:26:06

标签: php regex magento callback preg-replace

当我在搜索Magento打开sql查询日志记录时,我发现了一条修改了Magento核心query函数的帖子,如下所示:

public function query($sql, $bind = array())
{
$this->_debugTimer();
try {
$sql = (string)$sql;
if (strpos($sql, ':') !== false || strpos($sql, '?') !== false) {
$this->_bindParams = $bind;
$sql = preg_replace_callback('#(([\'"])((2)|((.*?[^\])2)))#', array($this, 'proccessBindCallback'), $sql);
$bind = $this->_bindParams;
}
$code = 'SQL: ' . $sql . "rn";
if ($bind) {
$code .= 'BIND: ' . print_r($bind, true) . "rn";
}
$this->_debugWriteToFile("[".date('Y-m-d H:i:s')."] ".$code);
$result = parent::query($sql, $bind);
}
catch (Exception $e) {
$this->_debugStat(self::DEBUG_QUERY, $sql, $bind);
$this->_debugException($e);
}
$this->_debugStat(self::DEBUG_QUERY, $sql, $bind, $result);
return $result;
}

我没有得到的是为什么这里需要preg_replace_callback以及当我在编辑器中放入上述代码时,在语法中包含preg_replace_callback的行中出现的问题是什么?

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

你在[^ \]附近的regexp中有错误,这是对的

'#(([\'"])((2)|((.*?[^\\])2)))#'

对于php字符串,你还需要转义一些字符

   $re = "/#(([\\'\"])((2)|((.*?[^\\\\])2)))#/";  
   $str = "";` 
   preg_match($re, $str, $matches);

我不使用https://regex101.com/来检查和调试regexp。