时间:2021-07-01 10:21:17 帮助过:36人阅读
- <code><!--?php
- echo '<h2-->正则表达式匹配中文<br>';
- $a = '天地不仁,以万物为刍狗';
- $b = preg_replace('/万/','萬',$a);
- echo $b;
- echo '<h2>加上方括号后替换结果出现乱码</h2><br>';
- $c = '天地不仁,以万物为刍狗';
- $d = preg_replace('/[万]/','萬',$a);
- echo $d;
- ?>
- </code>
以上程序运行结果可以在http://nyaii.com/s/test.php看到。不知为何,为匹配的中文字符加上方括号后就出现了乱码。同样的情形,在javascript中执行就一切正常。
- <code> '天地不仁'.replace(/[天]/,'')
- //outputs "地不仁"
- </code>
- <code><!--?php
- echo '<h2-->正则表达式匹配中文<br>';
- $a = '天地不仁,以万物为刍狗';
- $b = preg_replace('/万/','萬',$a);
- echo $b;
- echo '<h2>加上方括号后替换结果出现乱码</h2><br>';
- $c = '天地不仁,以万物为刍狗';
- $d = preg_replace('/[万]/','萬',$a);
- echo $d;
- ?>
- </code>
以上程序运行结果可以在http://nyaii.com/s/test.php看到。不知为何,为匹配的中文字符加上方括号后就出现了乱码。同样的情形,在javascript中执行就一切正常。
- <code> '天地不仁'.replace(/[天]/,'')
- //outputs "地不仁"
- </code>
加上UTF8修饰符即可
- <code>$d = preg_replace('/[万]/u','萬',$a);</code>
其余修饰符请见
http://php.com/manual/en/reference.pcre.pattern.modifiers.php
以下为对于题主评论中的问题的补充内容
关于为什么[]内就需要加u修饰符的问题,实际上严格来说,两种场合你最好都加上u修饰符
但为什么[]就会导致乱码呢,这就要从字节层面而不是字符层面来解释了。
首先我们知道PHP的字符串并不是Unicode进行存储的,然后我们来看下这个代码
- <code><!--?php
- $a = "万";
- echo strlen($a); //3
- for ($i = 0; $i < strlen($a); $i++) {
- echo dechex(ord($a[$i])) . ' '; //e4 b8 87
- }</code--></code>
我们可以拿到"万"字的utf8十六进制编码是e4b887
所以在没有开启utf8修饰符的时候,正则表达式引擎并没有把"万"当成一个独立的字符,而是三个字节的连续数据。
以下是结论:
当没有[]进行匹配的时候,它寻找的是十六进制编码值为 e4 b8 87 的三个连续字符,换句话说,实际上你的模式是\xe4\xb8\x87
,但这种连续字符的出现在你的字符串中,只有"万"字能对上,所以替换了并不会有乱码。但如果你的字符串里面可能还要包括四字节的utf8编码字符,例如emoji,可能就会导致问题了
当你在万外面包装了[],正则表达式引擎实际上找的是[\xe4\xb8\x87]
,懂正则表达式的很快就能发现它实际上是匹配这三个字符的任意一个,所以这个时候就会影响到除了万以外的别的汉字了
当你加了utf8修饰符之后,"万"会被正则表达式当成是一个独立的字符,所以不再会产生这个问题
至于javascript,因为它对字符编码是原生的unicode,每个字符都会被当成一个字符而不是拆分成字节数据,所以不会产生这个问题
人气教程排行
-
174次
1
php如何获取跳转前的url
-
174次
2
php格林威治时间转换成当前时间的方法
-
174次
3
为什么php不能做大型系统?
-
174次
4
range函数怎么用
-
174次
5
php中计算页面加载时间几种方法总结_PHP教程
-
174次
6
求帮助,关于paypal支付返回值修改订单状态
-
174次
7
typecho怎么配置文章内容页?
-
174次
8
PhpStorm左侧structure不显示文件的方法列表是这么回事?
-
174次
9
查看PHP的环境变量_PHP
-
174次
10
PHP Primary script unknown 解决方法总结
-
174次
11
php的命名空间与自动加载实现方法
-
174次
12
解决laravel 出现ajax请求419(unknown status)的问题
-
173次
13
php 如何删除mysql记录
-
173次
14
PHP如何替换数组中的指定元素
-
173次
15
怎么去除字符串中非汉字、非字母、非数字的字符
-
173次
16
mysql如何一次执行多条SQL语句
-
173次
17
修改header里面的Connection为close解决方法
-
173次
18
PHP基于session.upload_progress 实现文件上传进度显示功能详解
-
173次
19
php5.6.x到php7.0.x特性小结
-
172次
20
php为什么会出现504错误