PHP preg_replace用数组时,首尾带重音字符的单词匹配失效
解决带重音字符的单词无法被正则
\b匹配的问题 我之前也碰到过完全一样的坑!你代码里的así匹配失败,核心原因是ASCII原生的\b单词边界不认识Unicode重音字符。
为什么原来的代码不行?
\b是基于ASCII规则设计的单词边界,它只把A-Za-z0-9_这些字符认定为"单词字符"。带重音的í属于Unicode字符,在默认正则模式下(没加u修饰符),PCRE会把它当成普通字节序列处理,不会识别为单词的一部分。所以así末尾的í和后面空格之间,\b根本不认为是单词边界,自然匹配不到目标单词。
解决方法:改用Unicode兼容的边界匹配
我们需要调整正则规则,让它能识别Unicode字母的边界,同时开启Unicode模式处理字符串:
方案1:自定义Unicode单词边界(兼容性更强)
用(?<!\p{L})(前面不是Unicode字母)和(?!\p{L})(后面不是Unicode字母)替代\b,再加上u修饰符让正则支持Unicode解析:
$str = "A string containing the word así which should be changed to color purple"; // 使用Unicode字母边界,同时开启iu修饰符(i忽略大小写,u启用Unicode模式) $prac[] = "/(?<!\p{L})así(?!\p{L})/iu"; $prac2[] = "<span class='readword' style='color:purple'>$0</span>"; $str = preg_replace($prac, $prac2, $str); echo $str;
方案2:开启Unicode模式的\b(简化版)
如果你的PHP版本支持,也可以直接给正则加上u修饰符,此时\b会基于Unicode单词字符(包括\p{L}字母、\p{N}数字和下划线)判断边界:
$str = "A string containing the word así which should be changed to color purple"; $prac[] = "/\basí\b/iu"; $prac2[] = "<span class='readword' style='color:purple'>$0</span>"; $str = preg_replace($prac, $prac2, $str); echo $str;
两种方案都能解决问题,方案1的可控性更强,适合需要精确控制边界规则的场景。
内容的提问来源于stack exchange,提问作者Jonathan Kortes
相关产品推荐
相关产品推荐

