preg_replace替换含引号内容时出现乱码?技术咨询
为什么preg_replace处理智能引号时出现乱码?
这个问题我之前调试类似代码时也踩过坑,核心是正则引擎的多字节字符支持没配置对,加上UTF-8编码的细节没处理好导致的。
问题根源
你用的“”这类智能引号是UTF-8编码的多字节字符(每个字符占2个字节),但PHP的preg_replace默认是单字节模式——它会把多字节字符拆成单个独立的字节来匹配。你的正则表达式/(["“”„]Bob["“”„])/里的“和”被拆成了单个字节,匹配替换后这些孤立的字节无法组成有效的UTF-8字符,浏览器就会显示成乱码的�符号。
解决办法
只需要给正则表达式加上u修饰符,开启UTF-8多字节支持,让正则引擎正确识别完整的多字节字符:
$string = 'This is “Bob” Batman.'; echo $string . '<br>'; // 加上u修饰符开启UTF-8多字节支持 $string = preg_replace('/(["“”„]Bob["“”„])/u', '-$1-', $string); echo $string;
另外要确保你的PHP文件本身是UTF-8无BOM编码,这样字符串里的智能引号才能被PHP正确识别为UTF-8字符,避免编码不一致的问题。
修改后输出
执行修改后的代码,就能得到你预期的结果:
This is “Bob” Batman.
This is -“Bob”- Batman.
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

