在处理字符串替换时,PHP 的 preg_replace_callback() 函数可以通过一个回调函数对匹配结果进行灵活处理。但如果你有多个不同的正则表达式,每个需要用不同的逻辑来处理,preg_replace_callback_array() 就是你理想的选择。
自 PHP 7 起,preg_replace_callback_array() 提供了一种优雅的方式,允许我们用一个关联数组的形式,同时定义多个正则模式及其对应的回调函数。
本文将带你了解其用法,并通过示例展示如何同时处理多个匹配逻辑。
preg_replace_callback_array(array $patterns_and_callbacks, string $subject, int $limit = -1, int &$count = null): string|array|null
$patterns_and_callbacks 是一个关联数组,键是正则表达式,值是对应的回调函数。
$subject 是要处理的字符串。
假设我们要识别文本中的链接和邮箱地址,将链接包裹成 <a> 标签,同时将邮箱地址加上 mailto:。
$text = <<<EOT
欢迎访问我们的网站 http://m66.net/page,你也可以发邮件到 support@m66.net 咨询。
EOT;
$result = preg_replace_callback_array([
// 处理 URL
'/\bhttps?:\/\/[^\s]+/i' => function ($matches) {
$url = htmlspecialchars($matches[0]);
return "<a href=\"{$url}\">{$url}</a>";
},
// 处理邮箱地址
'/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/i' => function ($matches) {
$email = htmlspecialchars($matches[0]);
return "<a href=\"mailto:{$email}\">{$email}</a>";
}
], $text);
echo $result;
欢迎访问我们的网站 <a href="http://m66.net/page">http://m66.net/page</a>,你也可以发邮件到 <a href="mailto:support@m66.net">support@m66.net</a> 咨询。
preg_replace_callback_array() 特别适合处理:
各类文本解析,如 Markdown、BBCode、自定义语法等;
多种格式的识别与替换;
分离处理复杂文本中的不同结构时提高可读性和维护性。
正则表达式的顺序很重要,前面的规则会优先执行。
使用 htmlspecialchars() 来避免 XSS 攻击(尤其是在处理用户输入时)。
PHP 的 PCRE 库在高版本中更加强大,建议使用 PHP 7.1+。
使用 preg_replace_callback_array(),我们可以轻松定义多个正则模式及其对应处理方式,代码结构更清晰、逻辑更分离。它是文本处理中一个强大且被低估的工具。
掌握它,不仅能让你的代码更优雅,也能显著提高开发效率。