You need to enable JavaScript to run this app. 使用preg_replace实现含重音搜索词高亮的异常问题排查
优惠活动
大模型
产品
解决方案
定价
更多

使用preg_replace实现含重音搜索词高亮的异常问题排查

问题原因排查

你原来的代码存在3个核心问题导致匹配失效:

  1. 重音映射数组$corr配置错误:
    • s对应的字符组漏了普通小写s,导致搜索词中的s只能匹配带重音的s类字符,无法匹配普通的s/S,这是sahra匹配不到sähra、小写sygmay匹配不到大写Sygmaý的核心原因
    • 重复定义了o键,后面的定义会覆盖前面的,需要合并为一个规则
  2. preg_quote未指定分隔符,当搜索词包含/时会直接触发正则语法错误
  3. 未对搜索词做多字节统一转小写处理,特殊多字节字符的大小写匹配容易出现异常

修复后的代码

function highlightWords($text, $searchTerm){
    // 修正重音映射:补全普通字符、合并重复规则
    $corr = [
        'a' => '[aäâ]',
        'o' => '[oöòóôõøō]',
        'c' => '[cç]',
        's' => '[sşśšșŝ]',
        'y' => '[yýÿŷȳ]',
        'n' => '[nñńň]',
        'u' => '[uü]'
    ];
    // 先把搜索词统一转成小写,转义时指定正则分隔符避免特殊字符报错
    $key = preg_quote(mb_strtolower($searchTerm), '/');
    // 替换生成正则规则,保留iu修饰符实现大小写不敏感+UTF-8模式匹配
    $pattern = '/' . strtr($key, $corr) . '/iu';
    // 执行替换高亮
    return preg_replace($pattern, '<b>$0</b>', $text);
}

验证效果

用你提供的测试用例验证:

  • 测试文本:Sygmaý çykdy deşdi-sähra düzünden
  • 搜索duz:可正常高亮düz
  • 搜索sahra:可正常高亮sähra
  • 搜索cykdy:可正常高亮çykdy
  • 搜索小写sygmay/sygmaý:均可正常高亮开头的Sygmaý

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 16:12:02