• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > PHP字符串中用正则表达式匹配中文出现乱码

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

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了php正则截取字符串,php正则匹配字符串,php 正则替换字符串,php 正则分割字符串,php字符串常用函数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:PHP字符串中用正则表达式匹配中文出现乱码
描述:

<?php
echo '<h2>正则表达式匹配中文</h2><br>';
$a = '天地不仁,以万物为刍狗';
$b = preg_replace('/万/','萬',$a);
echo $b;
echo '<h2>加上方括号后替换结果出现乱码</h2><br>';
$c = '天地不仁,以万物为刍狗';
$d = preg_replace('/[万]/','萬',$a);
echo $d;
 ?>

以上程序运行结果可以在http://nyaii.com/s/test.php看到。不知为何,为匹配的中文字符加上方括号后就出现了乱码。同样的情形,在javascript中执行就一切正常。

 '天地不仁'.replace(/[天]/,'')
 //outputs "地不仁"


解决方案1:

加上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修饰符的时候,正则表达式引擎并没有把"万"当成一个独立的字符,而是三个字节的连续数据。

以下是结论:

  1. 当没有[]进行匹配的时候,它寻找的是十六进制编码值为 e4 b8 87 的三个连续字符,换句话说,实际上你的模式是\xe4\xb8\x87,但这种连续字符的出现在你的字符串中,只有"万"字能对上,所以替换了并不会有乱码。但如果你的字符串里面可能还要包括四字节的utf8编码字符,例如emoji,可能就会导致问题了

  2. 当你在万外面包装了[],正则表达式引擎实际上找的是[\xe4\xb8\x87],懂正则表达式的很快就能发现它实际上是匹配这三个字符的任意一个,所以这个时候就会影响到除了万以外的别的汉字了

  3. 当你加了utf8修饰符之后,"万"会被正则表达式当成是一个独立的字符,所以不再会产生这个问题

至于javascript,因为它对字符编码是原生的unicode,每个字符都会被当成一个字符而不是拆分成字节数据,所以不会产生这个问题


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-06-07 netty在linux上报错,高手帮帮忙!
  • 2017-06-07 java如何写2个数字交换
  • 2017-06-07 EJB3部署在JBoss500-GA上,客户端调用报异常。
  • 2017-06-07 howtoparsingmutilhost:portbypython3
  • 2017-06-07 安卓开发,如何通过intent传递图片+文字到微信?
  • 2017-06-07 抢啊抢,抢沙发!
  • 2017-06-07 命令scrapy下无法补全
  • 2017-06-07 (python)PTVS20RCVS2012的安装问题
  • 2017-06-07 js正则表达式js正则匹配
  • 2017-06-07 python读写文件优化

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • python爬虫(python)apache主页的缩放怎么设置?
    • pyqtGridLayout不显示widget
    • php怎么给redis添加一个键呢?
    • 如何实现dos下的命令行解析?
    • shell脚本中变量使用问题?
    • hihocoder#1034毁灭者问题,提交总是WA
    • 七牛的防盗链目前只能通过简单的Referer来控制吗
    • switchysharp如何手动配置规则
    • myEclipse发布ejb3到JBoss,报错!请大家帮忙!!
    • htmlUnit大神求助啊,这错误真是太邪门了

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有