php正则匹配中文乱码问题怎么解决?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!
创新互联公司是一家集网站建设,鹰潭企业网站建设,鹰潭品牌网站建设,网站定制,鹰潭网站建设报价,网络营销,网络优化,鹰潭网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。php正则匹配中文乱码的解决办法:首先打开PHP代码文件;然后在代码文件中加上UTF8修饰符即可,其正则表达式的语句如“preg_replace('/[万]/u','萬',$a);”。
具体问题:
PHP字符串中用正则表达式匹配中文出现乱码
<?php echo '<h3>正则表达式匹配中文</h3><br>'; $a = '天地不仁,以万物为刍狗'; $b = preg_replace('/万/','萬',$a); echo $b; echo '<h3>加上方括号后替换结果出现乱码</h3><br>'; $c = '天地不仁,以万物为刍狗'; $d = preg_replace('/[万]/','萬',$a); echo $d; ?>
以上程序运行结果可以在http://nyaii.com/s/test.php看到。不知为何,为匹配的中文字符加上方括号后就出现了乱码。同样的情形,在javascript中执行就一切正常。
'天地不仁'.replace(/[天]/,'') //outputs "地不仁"
解决办法:
加上UTF8修饰符即可
$d = preg_replace('/[万]/u','萬',$a);
其余修饰符请见
http://php.net/manual/en/reference.pcre.pattern.modifiers.php
以下为对于题主评论中的问题的补充内容
关于为什么[]内就需要加u修饰符的问题,实际上严格来说,两种场合你最好都加上u修饰符
但为什么[]就会导致乱码呢,这就要从字节层面而不是字符层面来解释了。
首先我们知道PHP的字符串并不是Unicode进行存储的,然后我们来看下这个代码
<?php $a = "万"; echo strlen($a); //3 for ($i = 0; $i < strlen($a); $i++) { echo dechex(ord($a[$i])) . ' '; //e4 b8 87 }
我们可以拿到"万"字的utf8十六进制编码是e4b887
所以在没有开启utf8修饰符的时候,正则表达式引擎并没有把"万"当成一个独立的字符,而是三个字节的连续数据。
以下是结论:
当没有[]进行匹配的时候,它寻找的是十六进制编码值为 e4 b8 87 的三个连续字符,换句话说,实际上你的模式是\xe4\xb8\x87,但这种连续字符的出现在你的字符串中,只有"万"字能对上,所以替换了并不会有乱码。但如果你的字符串里面可能还要包括四字节的utf8编码字符,例如emoji,可能就会导致问题了
当你在万外面包装了[],正则表达式引擎实际上找的是[\xe4\xb8\x87],懂正则表达式的很快就能发现它实际上是匹配这三个字符的任意一个,所以这个时候就会影响到除了万以外的别的汉字了
当你加了utf8修饰符之后,"万"会被正则表达式当成是一个独立的字符,所以不再会产生这个问题
至于javascript,因为它对字符编码是原生的unicode,每个字符都会被当成一个字符而不是拆分成字节数据,所以不会产生这个问题
感谢各位的阅读!看完上述内容,你们对php正则匹配中文乱码问题怎么解决大概了解了吗?希望文章内容对大家有所帮助。如果想了解更多相关文章内容,欢迎关注创新互联-成都网站建设公司行业资讯频道。
标题名称:php正则匹配中文乱码问题怎么解决-创新互联
网页地址:https://www.cdcxhl.com/article34/cehope.html
成都网站建设公司_创新互联,为您提供网站建设、Google、ChatGPT、App开发、网站内链、用户体验
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联