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实现网上点歌(二)
Oct 09 PHP
php split汉字
Jun 05 PHP
apache+codeigniter 通过.htcaccess做动态二级域名解析
Jul 01 PHP
使用swoole扩展php websocket示例
Feb 13 PHP
php pthreads多线程的安装与使用
Jan 19 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
Dec 02 PHP
php技巧小结【推荐】
Jan 19 PHP
PHP区块查询实现方法分析
May 12 PHP
php处理多图上传压缩代码功能
Jun 13 PHP
php微信公众号开发之翻页查询
Oct 20 PHP
PHP正则匹配到2个字符串之间的内容方法
Dec 24 PHP
解决php写入数据库乱码的问题
Sep 17 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 常用函数库和一些实用小技巧
2009/01/01 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
php验证身份证号码正确性的函数
2016/07/20 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
php文件包含目录配置open_basedir的使用与性能详解
2017/04/03 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
PHP实现读取文件夹及批量重命名文件操作示例
2019/04/15 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
2019/10/21 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
纯js实现隔行变色效果
2017/11/29 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
django框架auth模块用法实例详解
2019/12/10 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
使用CSS3制作一个简单的进度条(demo)
2017/05/23 HTML / CSS
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
Kangol帽子官网:坎戈尔袋鼠
2018/09/26 全球购物
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
学雷锋标语
2014/06/25 职场文书
项目合作协议书
2014/09/23 职场文书
2014年个人教学工作总结
2014/12/09 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书