使用preg_replace替换单个弯引号时出现多次替换,该如何排查?
问题原因及解决方法
你的问题出在正则表达式未启用多字节模式。
弯引号‘属于UTF-8编码的多字节字符,通常占用3个字节。默认情况下preg_replace以单字节模式处理字符串,会把这个多字节字符拆分成3个独立的单字节。此时你的正则/[‘]/在单字节模式下无法正确识别完整的弯引号,会把每个拆分出的字节都判定为匹配项,因此每个字节都被替换成x,最终输出xxx。
解决方法
- 给正则表达式添加
u修饰符,启用UTF-8多字节模式,让正则引擎正确识别完整的多字节字符:preg_replace('/[‘]/u', 'x', '‘'); - 若仅需匹配单个弯引号,也可以简化正则,同样加上
u修饰符:preg_replace('/‘/u', 'x', '‘');
内容的提问来源于stack exchange,提问作者panthro
相关产品推荐
相关产品推荐

