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 相关文章推荐
PHPlet在Windows下的安装
Oct 09 PHP
PHP下对数组进行排序的函数
Aug 08 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
Aug 09 PHP
Yii实现自动加载类地图的方法
Apr 01 PHP
分享PHP守护进程类
Dec 30 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
Jul 21 PHP
PHP Oauth授权和本地加密实现方法
Aug 12 PHP
Zend Framework上传文件重命名的实现方法
Nov 25 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
Laravel实现autoload方法详解
May 07 PHP
PHP观察者模式原理与简单实现方法示例
Aug 25 PHP
Laravel配置全局公共函数的方法步骤
May 09 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之第四天
2006/10/09 PHP
php比较多维数组中值的大小排序实现代码
2012/09/08 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
2016/05/11 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
laravel 错误处理,接口错误返回json代码
2019/10/25 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
javascript preload&lazy load
2010/05/13 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
Javascript中的Prototype到底是什么
2016/02/16 Javascript
javascript正则表达式之分组概念与用法实例
2016/06/16 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
Postman参数化实现过程及原理解析
2020/08/13 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
python创建线程示例
2014/05/06 Python
python登录豆瓣并发帖的方法
2015/07/08 Python
tornado 多进程模式解析
2018/01/15 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
对python 各种删除文件失败的处理方式分享
2018/04/24 Python
浅谈python实现Google翻译PDF,解决换行的问题
2018/11/28 Python
python使用KNN算法识别手写数字
2019/04/25 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
Python openpyxl 插入折线图实例
2020/04/17 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
2021/01/27 Python
二年级数学教学反思
2014/01/21 职场文书
单位委托书
2014/10/15 职场文书
工作会议通知
2015/04/15 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS
MySQL系列之七 MySQL存储引擎
2021/07/02 MySQL