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 相关文章推荐
phpmyadmin打开很慢的解决方法
Apr 21 PHP
php基于curl扩展制作跨平台的restfule 接口
May 11 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
Aug 23 PHP
PHP中如何使用session实现保存用户登录信息
Oct 20 PHP
PHP开发中AJAX技术的简单应用
Dec 11 PHP
thinkPHP2.1自定义标签库的导入方法详解
Jul 20 PHP
PHP定时任务获取微信access_token的方法
Oct 10 PHP
php文件上传、下载和删除示例
Aug 28 PHP
php简单计算年龄的方法(周岁与虚岁)
Dec 06 PHP
php使用preg_match()函数验证ip地址的方法
Jan 07 PHP
PHP设计模式之建造者模式定义与用法简单示例
Aug 13 PHP
关于Curl在Swoole协程中的解决方案详析
Sep 12 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中$_FILES的使用以及注意事项
2013/07/05 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
javascript实现左右控制无缝滚动
2014/12/31 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
JavaScript对象学习小结
2015/09/02 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
2017/07/18 Javascript
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
angularjs1.X 重构controller 的方法小结
2019/08/15 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
2019/09/26 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
Python中针对函数处理的特殊方法
2014/03/06 Python
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
用Python实现换行符转换的脚本的教程
2015/04/16 Python
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
opencv python 图像去噪的实现方法
2018/08/31 Python
Win10下python3.5和python2.7环境变量配置教程
2018/09/18 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
升旗仪式演讲稿
2014/05/08 职场文书
2014公司年终工作总结
2014/12/19 职场文书
2015年综治宣传月活动总结
2015/03/25 职场文书
2016年9月份红领巾广播稿
2015/12/21 职场文书
深入理解redis中multi与pipeline
2021/06/02 Redis
React 高阶组件HOC用法归纳
2021/06/13 Javascript
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python