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 相关文章推荐
教你IIS6的PHP最佳配置方法
Sep 05 PHP
PHP语法速查表
Jan 02 PHP
php 高效率写法 推荐
Feb 21 PHP
PHP操作数组相关函数
Feb 03 PHP
PHP中SESSION使用中的一点经验总结
Mar 30 PHP
PHP 面向对象详解
Sep 13 PHP
php获取操作系统语言代码
Nov 04 PHP
php使用指定字符列表生成随机字符串的方法
Apr 18 PHP
PHP使用ODBC连接数据库的方法
Jul 18 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
Jun 16 PHP
Laravel5.4框架中视图共享数据的方法详解
Sep 05 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
Oct 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 生成WML页面方法详解
2009/08/09 PHP
PHP中Session可能会引起并发问题
2015/06/26 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
javascript读取RSS数据
2007/01/20 Javascript
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
jQuery中;function($,undefined) 前面的分号的用处
2014/12/17 Javascript
JQuery页面地址处理插件jqURL详解
2015/05/03 Javascript
jQuery寻找n以内完全数的方法
2015/06/24 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
Vue实现用户自定义字段显示数据的方法
2018/08/28 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
Python模块学习 datetime介绍
2012/08/27 Python
Python入门篇之列表和元组
2014/10/17 Python
详解django2中关于时间处理策略
2019/03/06 Python
用python做游戏的细节详解
2019/06/25 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
HTML5之语义标签介绍
2016/07/07 HTML / CSS
SneakerStudio英国:最佳运动鞋商店
2019/05/22 全球购物
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
电气工程及自动化专业自荐书范文
2013/12/18 职场文书
委托公证书
2014/04/08 职场文书
《春晓》教学反思
2014/04/20 职场文书
神农溪导游词
2015/02/11 职场文书
2016年元旦寄语
2015/08/17 职场文书