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 sprintf() 函数的应用(定义和用法)
Jun 29 PHP
PHP之生成GIF动画的实现方法
Jun 07 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
May 15 PHP
PHP函数strip_tags的一个bug浅析
May 22 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
php生成与读取excel文件
Oct 14 PHP
php实现跨域提交form表单的方法【2种方法】
Oct 17 PHP
PHP实现微信小程序用户授权的工具类示例
Mar 05 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
May 08 PHP
thinkphp框架使用JWTtoken的方法详解
Oct 10 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
php比较两个绝对时间的大小
2014/01/31 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
基于jquery创建的一个图片、视频缓冲的效果样式插件
2012/08/28 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
2016/12/04 Javascript
教你快速搭建Node.Js服务器的方法教程
2017/03/30 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
微信小程序实现发送验证码按钮效果
2018/12/20 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
浅谈python装饰器探究与参数的领取
2017/12/01 Python
Python拼接字符串的7种方法总结
2018/11/01 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
OpenCV哈里斯(Harris)角点检测的实现
2020/01/15 Python
Python random模块制作简易的四位数验证码
2020/02/01 Python
Python3批量创建Crowd用户并分配组
2020/05/20 Python
python中最小二乘法详细讲解
2021/02/19 Python
运动会演讲稿50字
2014/08/25 职场文书
学校运动会广播稿100条
2014/09/14 职场文书
群众路线教育实践活动剖析材料
2014/09/30 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
《小小的船》教学反思
2016/02/18 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis