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 相关文章推荐
一个SQL管理员的web接口
Oct 09 PHP
备份mysql数据库的php代码(一个表一个文件)
May 28 PHP
json的键名为数字时的调用方式(示例代码)
Nov 15 PHP
新浪SAE云平台下使用codeigniter的数据库配置
Jun 12 PHP
PHP中使用数组指针函数操作数组示例
Nov 19 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
Mar 26 PHP
YiiFramework入门知识点总结(图文教程)
Dec 28 PHP
php集成动态口令认证
Jul 21 PHP
php基于PDO实现功能强大的MYSQL封装类实例
Feb 27 PHP
php实现和c#一致的DES加密解密实例
Jul 24 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
Jun 20 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
Oct 04 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
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
CodeIgniter框架基本增删改查操作示例
2017/03/23 PHP
一段批量给页面上的控件赋值js
2010/06/19 Javascript
jquery multiSelect 多选下拉框
2010/07/09 Javascript
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
2016/06/02 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
layui多iframe页面控制定时器运行的方法
2019/09/05 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
VUE实现吸底按钮
2021/03/04 Vue.js
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python Paramiko模块的使用实际案例
2018/02/01 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
Python3爬虫中pyspider的安装步骤
2020/07/29 Python
python IP地址转整数
2020/11/20 Python
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
幼儿园毕业教师感言
2014/02/21 职场文书
高中军训感想800字
2014/02/23 职场文书
和解协议书
2014/04/16 职场文书
小学校本培训方案
2014/06/06 职场文书
学校清明节活动总结
2014/07/04 职场文书
企业员工集体活动方案
2014/08/17 职场文书
2014和解协议书范文
2014/09/15 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书