php正则表达匹配中文问题分析小结


Posted in PHP onMarch 25, 2012
$str = '中华人民共和国123456789abcdefg'; 
echo preg_match("/^[u4e00-u9fa5_a-zA-Z0-9]{3,15}$",$strName);

运行一下上面这段代码,看会有什么提示信息?

Warning: preg_match(): Compilation failed: PCRE does not support L, l, N, P, p, U, u, or X at offset 3 in F:wwwrootphptest.php on line 2
原来,PHP正则表达式中不支持下列 Perl 转义序列:L, l, N, P, p, U, u, or X

在 UTF-8 模式下,允许用“x{...}”,花括号中的内容是表示十六进制数字的字符串。

原来的十六进制转义序列 xhh 如果其值大于 127 的话则匹配了一个双字节 UTF-8 字符。
所以,
可以这样来解决

preg_match("/^[x80-xff_a-zA-Z0-9]{3,15}$",$strName); 
preg_match('/[x{2460}-x{2468}]/u', $str);

匹配 内码汉字
按照他提供的方式进行测试,代码如下:

$str = "php编程"; 
if (preg_match("/^[x{2460}-x{2468}]+$/u",$str)) { 
print("该字符串全部是中文"); 
} else { 
print("该字符串不全部是中文"); 
}

发现这次依然对是否为中文判断失常。不过,既然x表示的十六进制数据,为什么和js里边提供的范围x4e00-x9fa5不一样呢?于是我就换成了下边的代码:

$str = "php编程"; 
if (preg_match("/^[x4e00-x9fa5]+$/u",$str)) { 
print("该字符串全部是中文"); 
} else { 
print("该字符串不全部是中文"); 
}

本来以为铁定成功了的事情,没想到,warning又一次产生了:
Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 6 in test.php on line 3

看来又有错误的表达方式了,于是对照了一下那篇文章的表达方式,给“4e00”和“9fa5”两边分别用"{"和“}”包起来,跑了一遍,发现真的准确了:

$str = "php编程"; 
if (preg_match("/^[x{4e00}-x{9fa5}]+$/u",$str)) { 
print("该字符串全部是中文"); 
} else { 
print("该字符串不全部是中文"); 
}

知道了php中utf-8编码下用正则表达式匹配汉字的最终正确表达式——/^[x{4e00}-x{9fa5}]+$/u,

最后总结出

//if (preg_match(“/^[".chr(0xa1)."-".chr(0xff)."]+$/”, $str)) { //只能在GB2312情况下使用 
if (preg_match(“/^[x7f-xff]+$/”, $str)) { //兼容gb2312,utf-8 
echo “正确输入”; 
} else { 
echo “错误输入”; 
}

双字节字符编码范围

1. GBK (GB2312/GB18030)
x00-xff GBK双字节编码范围
x20-x7f ASCII
xa1-xff 中文 gb2312
x80-xff 中文 gbk

2. UTF-8 (Unicode)

u4e00-u9fa5 (中文)
x3130-x318F (韩文
xAC00-xD7A3 (韩文)
u0800-u4e00 (日文)

PHP 相关文章推荐
PHP 作用域解析运算符(::)
Jul 27 PHP
PHP+JS+rsa数据加密传输实现代码
Mar 23 PHP
PHP操作MongoDB GridFS 存储文件的详解
Jun 20 PHP
使用ob系列函数实现PHP网站页面静态化
Aug 13 PHP
ThinkPHP中I(),U(),$this->post()等函数用法
Nov 22 PHP
php批量添加数据与批量更新数据的实现方法
Dec 16 PHP
给ECShop添加最新评论
Jan 07 PHP
浅谈PHP中JSON数据操作
Jul 01 PHP
php编译安装php-amq扩展简明教程
Jun 25 PHP
thinkPHP框架自动填充原理与用法分析
Apr 03 PHP
PHP ADODB实现事务处理功能示例
May 25 PHP
thinkphp5框架路由原理与用法详解
Feb 11 PHP
二招解决php乱码问题
Mar 25 #PHP
php引用地址改变变量值的问题
Mar 23 #PHP
奇怪的PHP引用效率问题分析
Mar 23 #PHP
php地址引用(php地址引用的效率问题)
Mar 23 #PHP
PHP遍历数组的几种方法
Mar 22 #PHP
php遍历数组的方法分享
Mar 22 #PHP
php中大括号作用介绍
Mar 22 #PHP
You might like
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
JavaScript Event学习第九章 鼠标事件
2010/02/08 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
jQuery大于号(>)选择器的作用解释
2015/01/13 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
2016/05/25 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
JS module的导出和导入的实现代码
2019/02/25 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
Node.js系列之发起get/post请求(2)
2019/08/30 Javascript
JavaScript代码模拟鼠标自动点击事件示例
2020/08/07 Javascript
JavaScript构造函数原理及实现流程解析
2020/11/19 Javascript
一个简单的python程序实例(通讯录)
2013/11/29 Python
python虚拟环境的安装配置图文教程
2017/10/20 Python
浅析Python装饰器以及装饰器模式
2018/05/28 Python
Python Pandas 获取列匹配特定值的行的索引问题
2019/07/01 Python
python-numpy-指数分布实例详解
2019/12/07 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
python getopt模块使用实例解析
2019/12/18 Python
Pycharm修改python路径过程图解
2020/05/22 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
一套Delphi的笔试题二
2013/05/11 面试题
汉语专业应届生求职信
2013/10/01 职场文书
工商治理实习生的自我评价分享
2014/02/20 职场文书
元旦获奖感言
2014/03/08 职场文书
毕业生实习期转正自我鉴定
2014/09/26 职场文书
义诊活动总结
2015/02/04 职场文书
大学生青年志愿者活动总结
2015/05/06 职场文书
研讨会致辞
2015/07/31 职场文书