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 相关文章推荐
基于mysql的bbs设计(五)
Oct 09 PHP
php中常用编辑器推荐
Jan 02 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
Aug 24 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
Apr 15 PHP
php下统计用户在线时间的一种尝试
Aug 26 PHP
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
May 19 PHP
PHP写杨辉三角实例代码
Jul 17 PHP
PHP页面输出时js设置input框的选中值
Sep 30 PHP
PHP+jquery+CSS制作头像登录窗(仿QQ登陆)
Oct 20 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 PHP
[原创]php实现数组按拼音顺序排序的方法
May 03 PHP
详解PHP用mb_string处理windows中文字符
May 26 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
四个常见html网页乱码问题及解决办法
2015/09/08 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
Jquery api 速查表分享
2015/01/12 Javascript
javascript省市级联功能实现方法实例详解
2015/10/20 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
详解使用webpack打包编写一个vue-toast插件
2017/11/08 Javascript
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
[02:25]DOTA2英雄基础教程 熊战士
2014/01/03 DOTA
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
2013/12/08 Python
python获得一个月有多少天的方法
2015/06/04 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
python 分离文件名和路径以及分离文件名和后缀的方法
2018/10/21 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
pandas如何处理缺失值
2019/07/31 Python
Python 支持向量机分类器的实现
2020/01/15 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
应届生英语教师求职信
2013/11/05 职场文书
放飞蜻蜓反思
2014/02/05 职场文书
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
生日寄语大全
2014/04/08 职场文书
法制宣传月活动方案
2014/05/11 职场文书
创先争优承诺书
2015/01/20 职场文书
音乐教师求职信范文
2015/03/20 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
Python基础之字符串格式化详解
2021/04/21 Python
Redis过期数据是否会被立马删除
2022/07/23 Redis