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 相关文章推荐
模拟OICQ的实现思路和核心程序(二)
Oct 09 PHP
使用网络地址转换实现多服务器负载均衡
Oct 09 PHP
php仿ZOL分页类代码
Oct 02 PHP
php 3行代码的分页算法(求起始页和结束页)
Oct 21 PHP
JS与PHP向函数传递可变参数的区别实例代码
May 18 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
Jun 02 PHP
php 缩略图实现函数代码
Jun 23 PHP
ThinkPHP实现事务回滚示例代码
Jun 23 PHP
PHP多态代码实例
Jun 26 PHP
PHP实现适用于自定义的验证码类
Jun 15 PHP
php多文件打包下载的实例代码
Jul 12 PHP
彻底搞懂PHP 变量结构体
Oct 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
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
Yii使用Captcha验证码的方法
2015/12/28 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
jquery取消选择select下拉框示例代码
2014/02/22 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
jQuery实现左右滑动的toggle方法
2018/03/03 jQuery
详解vue 数据传递的方法
2018/04/19 Javascript
微信小程序实现自动定位功能
2018/10/31 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
swiper实现异形轮播效果
2019/11/28 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
JavaScript实现随机点名程序
2020/03/25 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
python实现事件驱动
2018/11/21 Python
使用python判断jpeg图片的完整性实例
2019/06/10 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
keras多显卡训练方式
2020/06/10 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
CSS3 box-sizing属性
2009/04/17 HTML / CSS
国际领先的学术出版商:Springer
2017/01/11 全球购物
岗位职责的定义
2013/11/10 职场文书
庆元旦广播稿
2014/02/10 职场文书
党课培训主持词
2014/04/01 职场文书
在校实习生求职信
2014/06/18 职场文书
2015年党支部公开承诺书
2015/01/22 职场文书
会计稽核岗位职责
2015/04/13 职场文书
公司借款担保书
2015/09/22 职场文书
高考升学宴主持词
2019/06/21 职场文书