You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP多语言正则替换需求:匹配含非字母分隔符的目标字符串

PHP 多语言兼容的智能字符串替换函数实现

核心需求回顾

需要实现一个PHP函数,完成以下替换逻辑:

  • 在任意内容中搜索目标字符串数组中的条目
  • 即使目标字符串的字符间插入了任意非字母分隔符(符号、空格等),仍能匹配
  • 支持所有语言的大小写组合(含非拉丁语系,比如俄语、阿拉伯语的大小写变体)
  • 兼容全球语言字符(中、日、韩、俄、阿拉伯等)
  • 不限制目标字符串长度,只要去除分隔符后与原字符串一致即匹配

实现思路

针对每个需求点,用PCRE正则的Unicode特性解决:

  1. 非字母分隔符匹配:用\P{L}*匹配0或多个非Unicode字母字符(\p{L}代表任意语言的字母,\P{L}则是反向匹配)
  2. 大小写不敏感:启用i修饰符,配合u(Unicode模式),让正则支持非拉丁语系的大小写折叠匹配
  3. 全语言兼容:必须开启u模式,确保PHP能正确解析Unicode编码的多语言字符
  4. 无长度限制:将目标字符串拆分为单个字符,每个字符转义后用\P{L}*连接,生成动态正则表达式

完整实现代码

function smartStringReplace(string $content, array $stringsToReplace, string $replacementString): string
{
    foreach ($stringsToReplace as $target) {
        // 跳过空字符串,避免无效正则
        if (empty($target)) {
            continue;
        }
        
        // 将目标字符串拆分为单个Unicode字符
        $chars = preg_split('//u', $target, -1, PREG_SPLIT_NO_EMPTY);
        
        // 对每个字符进行正则转义,然后用非字母分隔符模式连接
        $patternParts = array_map(function ($char) {
            return preg_quote($char, '/');
        }, $chars);
        $pattern = '/' . implode('\P{L}*', $patternParts) . '/ui';
        
        // 执行替换
        $content = preg_replace($pattern, $replacementString, $content);
    }
    
    return $content;
}

测试示例

输入

$content = "P-H P!p 中文测-试 日・本語 俄-Ру́сский-语";
$stringsToReplace = ["php", "中文测试", "日本語", "Русский"];
$replacement = "[已替换]";

echo smartStringReplace($content, $stringsToReplace, $replacement);

期望输出

[已替换] [已替换] [已替换] [已替换] 俄-[已替换]-语

关键细节说明

  • preg_split('//u', $target, ...):确保正确拆分Unicode字符,避免多字节字符被拆坏
  • preg_quote($char, '/'):转义目标字符中的正则特殊符号(如.、*、(等),防止正则语法错误
  • /ui修饰符:u开启Unicode模式,i启用大小写不敏感匹配,同时支持非拉丁语系的大小写转换

内容的提问来源于stack exchange,提问作者Obmerk Kronen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:20:18