php 正则匹配乱码,php 正则匹配中文 乱码问题

php 正则匹配中文 乱码问题

php正则匹配中文乱码的解决办法:首先打开PHP代码文件;然后在代码文件中加上UTF8修饰符即可,其正则表达式的语句如“preg_replace('/[万]/u','萬',$a);”。

4ad4c6b51238309f773a2a797cb2da59.png

推荐:《PHP视频教程》

具体问题:

PHP字符串中用正则表达式匹配中文出现乱码<?php

echo '

正则表达式匹配中文


';

$a = '天地不仁,以万物为刍狗';

$b = preg_replace('/万/','萬',$a);

echo $b;

echo '

加上方括号后替换结果出现乱码


';

$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 正则匹配中文 乱码问题相关教程

php preg match用法是什么

php preg match用法是执行一个正则表达式匹配,语法为【int preg_match ( string $pattern , string $subject [, array $matches [, int $flags.]】。 preg_match 函数用于执行一个正则表达式匹配。 语法 int preg_match ( string $pattern , string $subjec

php如何使用post跳转页面

php使用post跳转页面的方法:首先定义post处理页面url;然后获取当前页面的url,并解析url;接着获取url中的参数部分,将querycan参数解析到数组变量;最后循环拼接表单项,构造表单并跳转。 php使用post跳转页面的方法: 大家知道php可以利用header(Locatio

php如何隐藏部分邮箱

php隐藏部分邮箱的方法:首先创建一个PHP示例文件;然后定义一个hideStr方法;接着通过“preg_replace(/([\d\w+_-]{0,100})@/, ***@, $str, -1, $count);”方法实现隐藏。 推荐:《PHP视频教程》 PHP使用星号隐藏用户名,手机,邮箱的实现方法 PHP使用星号替代

解决phpmyadmin上传大的mysql文件

解决phpmyadmin上传大的mysql文件 为什么80%的码农都做不了架构师? 方法一,设置php.ini: vi./php.inifile_uploadsonupload_max_filesize=150Mpost_max_size=200M#若是比较大的sql文件,还需要设置一下:max_execution_time300#每个PHP页面运行的最大时间值(

PHP --- openssl加密

PHP --- openssl加密 为什么80%的码农都做不了架构师? php openssl rsa 加密解密应用 首先关于安装openssl。参考安装xdebug的类似。 到php源码包的目录 ext/openssl 下执行: /data/apps/php/bin/phpize ./configure --with-openssl --with-php-config=/data

grep及正则表达式用法总结

grep及正则表达式用法总结 一、grep的基本用法 grep是一个常见的文本选取工具,它可以将一段数据分析后,取出我们想要的,或者是经由关键字、正则表达式匹配选出我们想要的那一行。grep的用法及选项如下所示: grep:文本过滤工具用法1:grep [OPTIONS] PATTER

PHP创建和使用session cookie变量

PHP创建和使用session cookie变量 为什么80%的码农都做不了架构师? 该代码不可运行,只是将所有使用方法在这里列出,实际应该不同功能在不同页面使用,将在下面的例子中演示 ... ?php// session startsession_start(); // 开始一个会话,如果要使用session程

php 给图片添加水印 实例

php 给图片添加水印 实例 方法已经放在下面了: /** * 添加图片水印 * * @param $picPath * @param $logoPath */ private function _addWaterMark($picPath, $logoPath) { //如果图片不存在或者logo不存在则不处理 if (!file_exists($picPath) || !file_exist

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值