You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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('/([&quot;“”„]Bob[&quot;“”„])/u', '-$1-', $string);
echo $string;

另外要确保你的PHP文件本身是UTF-8无BOM编码,这样字符串里的智能引号才能被PHP正确识别为UTF-8字符,避免编码不一致的问题。

修改后输出

执行修改后的代码,就能得到你预期的结果:

This is “Bob” Batman.
This is -“Bob”- Batman.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:22:53