preg_replace_callback_array仅支持PHP 7.4+,需升级版本;键必须为带分隔符的合法正则(如'/#(\w+)/');回调接收完整$matches数组;匹配顺序由正则引擎决定,不保证数组键序。

preg_replace_callback_array 不能在 PHP 7.4 以下使用
这个函数是 PHP 7.4 新增的,如果你用的是 7.3 或更早版本,直接调用会报 Fatal error: Uncaught Error: Call to undefined function preg_replace_callback_array()。别折腾兼容写法——升级 PHP 是唯一稳妥解法。Docker 环境里检查 php -v,线上环境确认 phpinfo() 输出的版本号,别信配置文件里写的“大概 7.4”。
回调数组的键必须是合法正则模式(带分隔符)
键不是纯 pattern,而是完整带分隔符的正则字符串,比如 '/#(\w+)/' 合法,'#(\w+)' 会触发 Warning: preg_replace_callback_array(): Invalid PCRE pattern。常见错误包括:
- 漏写开头或结尾分隔符(如只写
'/(\d+)/i'却忘了闭合斜杠) - 用了没转义的分隔符本身(比如模式含
/却没用\/转义) - 键名用了变量或拼接字符串导致不可见空格或换行
推荐统一用 # 当分隔符,视觉干扰少,也避开 URL 或 HTML 属性里常见的 / 和 "。
每个回调函数接收一个 $matches 数组,不是单个匹配字符串
和 preg_replace_callback 一样,每个回调收到的是完整 $matches,其中 $matches[0] 是整个匹配文本,$matches[1] 是第一个捕获组。容易误以为只传捕获内容,结果写成 return strtoupper($matches) 导致返回数组变字符串出错。
立即学习“PHP免费学习笔记(深入)”;
典型用法示例:
$text = 'Price: $123, ID: #abc456';
$result = preg_replace_callback_array([
'/\$(\d+)/' => function ($m) {
return '¥' . (int)$m[1] * 7.2; // 汇率转换
},
'/#(\w+)/' => function ($m) {
return '<code>' . htmlspecialchars($m[1]) . '</code>';
}
], $text);
// → 'Price: ¥885.6, ID: <code>abc456</code>'
顺序不保证,长模式可能被短模式提前截断
preg_replace_callback_array 内部不是按数组顺序逐个扫描,而是把所有 pattern 合并成一个大正则(类似 (pattern1)|(pattern2)|...),所以实际匹配顺序取决于哪个 pattern 先命中,而不是你在数组里写的先后。如果两个 pattern 有重叠(比如 '/a/' 和 '/ab/'),'ab' 可能永远不被触发——因为 'a' 先匹配了第一个字符就停了。
规避方法只有两个:
- 确保 pattern 之间无前缀重叠(比如改用
'/ab?/'把逻辑收进一个 pattern) - 拆成多次
preg_replace_callback调用,自己控制顺序
别依赖键顺序,PHP 数组顺序在该函数里没有语义。



















