后端开发|php教程
php,正则表达式
后端开发-php教程
admin后台卡死源码,vscode完成html,ubuntu uucp,tomcat的acl,sqlite 自增类型,ecshop 地区插件,前端框架都有哪几种,爬虫谷歌学术的论文,php解决方案,seo优化服务好,html 3d 网站,网页地区显示代码,创力网站模板下载lzw
;$a = 天地不仁,以万物为刍狗;$b = preg_replace(/万/,萬,$a);echo $b;echo 加上方括号后替换结果出现乱码 ;$c = 天地不仁,以万物为刍狗;$d = preg_replace(/[万]/,萬,$a);echo $d; ?><?phpecho 正则表达式匹配中文
以上程序运行结果可以在/s/test.php看到。不知为何,为匹配的中文字符加上方括号后就出现了乱码。同样的情形,在javascript中执行就一切正常。
ios app 源码下载,vscode可以写游戏吗,ubuntu插硬盘,tomcat 怎么查看版本,node 爬虫 接口,php心跳包,付费seo排名怎么做,php 开发网站 源代码,Bootstrap响应式企业网站模板lzw
天地不仁.replace(/[天]/,\) //outputs "地不仁"
源码分享下载站源码,韦东山 ubuntu密码,土壤下的爬虫,php 极客,泉州站内seolzw
回复内容:
;$a = 天地不仁,以万物为刍狗;$b = preg_replace(/万/,萬,$a);echo $b;echo 加上方括号后替换结果出现乱码 ;$c = 天地不仁,以万物为刍狗;$d = preg_replace(/[万]/,萬,$a);echo $d; ?><?phpecho 正则表达式匹配中文
以上程序运行结果可以在/s/test.php看到。不知为何,为匹配的中文字符加上方括号后就出现了乱码。同样的情形,在javascript中执行就一切正常。
天地不仁.replace(/[天]/,\) //outputs "地不仁"
加上UTF8修饰符即可
$d = preg_replace(/[万]/u,萬,$a);
其余修饰符请见
/manual/en/reference.pcre.pattern.modifiers.php
以下为对于题主评论中的问题的补充内容
关于为什么[]内就需要加u修饰符的问题,实际上严格来说,两种场合你最好都加上u修饰符
但为什么[]就会导致乱码呢,这就要从字节层面而不是字符层面来解释了。
首先我们知道PHP的字符串并不是Unicode进行存储的,然后我们来看下这个代码
<?php$a = "万";echo strlen($a); //3for ($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,每个字符都会被当成一个字符而不是拆分成字节数据,所以不会产生这个问题