使用preg_replace实现含重音搜索词高亮的异常问题排查
问题原因排查
你原来的代码存在3个核心问题导致匹配失效:
- 重音映射数组
$corr配置错误:s对应的字符组漏了普通小写s,导致搜索词中的s只能匹配带重音的s类字符,无法匹配普通的s/S,这是sahra匹配不到sähra、小写sygmay匹配不到大写Sygmaý的核心原因- 重复定义了
o键,后面的定义会覆盖前面的,需要合并为一个规则
preg_quote未指定分隔符,当搜索词包含/时会直接触发正则语法错误- 未对搜索词做多字节统一转小写处理,特殊多字节字符的大小写匹配容易出现异常
修复后的代码
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
相关产品推荐
相关产品推荐

