PHP5升级至PHP7时preg_replace_callback匹配pattern的编写方法
正确匹配方案
1. 正则表达式
你可以直接沿用原PHP5版本的正则逻辑,删除/e修饰符同时优化捕获组,精准匹配目标结构:
$bandHFmtString = "#\{format\((\d+),([a-zA-Z0-9']+),(\d+)\)}#";
该正则的捕获组对应内容:
$matches[1]:format括号内第一个数字参数,示例中为26$matches[2]:format括号内中间的字符参数,示例中为num$matches[3]:format括号内第三个数字参数,示例中为4
2. 完整调用代码
你之前的代码存在匿名函数未闭合、正则语法错误的问题,修正后的完整代码如下:
$bandHFmtString = "#\{format\((\d+),([a-zA-Z0-9']+),(\d+)\)}#"; $subBandHead = preg_replace_callback($bandHFmtString, function ($matches) use ($queryData, $r) { // 直接通过捕获组获取参数,无需手动拆分字符串 return $this->formatSqlNumber($queryData[$r][$matches[1]], $matches[2], 'format'); }, $bandHdrs);
如果你的业务逻辑需要调用Report::formatSqlNumber,直接替换return行的逻辑即可。
原代码错误说明
你之前编写的正则错误地对字符组符号[]做了转义,导致规则变成匹配字面量方括号,自然无法匹配目标字符串的数字、字母内容,同时也没有做参数捕获,才需要额外手动拆分字符串,优化后的正则直接解决了这些问题。
内容的提问来源于stack exchange,提问作者alexJoe
相关产品推荐
相关产品推荐

