php正则表达匹配中文问题分析

$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:http://www.hzhuti.com/nokia/5800/ 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-8echo “正确输入”;} 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 (日文)

时间: 2024-10-12 16:51:38

php正则表达匹配中文问题分析的相关文章

python 中文正则表达匹配

需求:由于某个n年前的工具的错误,在复制一批文件的时候产生了大量的"复件xxxxxxx""复件(2)XXXXX"等类似文件,由于目录结构深,文件多,预计在5000万个,但是有多少这种错误的文件不清楚,因此写个脚本遍历删除. #encoding=utf-8 #author: skybug #date: 2014-05-11 #function: 遍历指目录,删除中文开头的文件名的图片 import os,re cnt = 0 pattern = re.compile(

正则验证匹配中文姓名全部源字符串

这个是验证匹配中文姓名的全部源串,在网上找了很久,大都是验证匹配含有中文,就在网上某人提供的正则的基础上修改成了验证所填姓名的每个字符,只有都匹配才能验证通过. 该正则为:^[\u4e00-\u9fa5]+(·[\u4e00-\u9fa5]+)*$ 截图验证: 1,普通姓名 2,少数民族带点姓名 3,排除错误 经过一系列的测试,目前没发现没有过滤的情况

js正则表达匹配&简单验证

var common = { isNotNull:function(object){ if(object == null || object == '' || object == undefined){ return false; } return true; }, MBToGB:function(mb){ return Math.round(((mb / (1024))*100)/100); }, myRound:function(number){ var result = Math.roun

正则表达基础学习(一)

0x00写在前面: 不管是PHP.Python还是JAVA等编程语言,在使用字符串匹配过程中,正则表达匹配往往是首选.下面是个人总结的关于正则表达的基本知识.初学往往只是基础,关键在于实践. 0x01正则表达式 - 概述: 正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子. 正则表达式可以从一个基础字符串中根据一定的匹配模式替换文本中的字符串.验证表单.提取字符串等等. 0x02正则表达式 - 基本匹配: 正则表达式其实就是在执行搜索时的格式,它由一些字母

PHP匹配中文正则(转载)!

php 正则匹配中文 (2011-09-26 10:10:46) 转载:http://hi.baidu.com/?_d/blog/item/063b77d5432f8f1aa18bb7fd.html 在javascript中,要判断字符串是中文是很简单的.比如: var str = "php编程"; if (/^[\u4e00-\u9fa5]+$/.test(str)) { alert("该字符串全部是中文"); } else { alert("该字符串不

利用Python正则匹配中文——爬取校园网公告栏中感兴趣的内容

写这个程序是因为校园网公告栏时不时会有学术报告,讲座之类的信息发布,但这类信息往往发布在讲座的前一天,以至于丢失很多重要消息.同时公告栏里也会发布一些跟学生无关的内容,比如工会主席会议啥的. 主要遇到的困难时对中文的正则匹配问题.(比如通过第一次正则可以提取到一个页面内的所有中文标题,第二次正则从这些中文标题中将能匹配上“报告”两个字的对象添加到结果list内) 学校公告页面是gb2312编码.我使用的方式是,整个工程使用utf-8编码,将需要匹配的关键字转换成utf-8编码格式,使用正则匹配u

通过完善邮箱匹配来一步步学习正则表达

首先,在学习之前先确定一下邮箱的格式,邮箱的一般格式为[email protected],其中xxx可为数字.字母.下划线_,中划线-,点号.,加号+等组成. 在看具体代码之前需要先了解一些基础知识 # []表示匹配字符集中的任意一个字符# \w 表示匹配任何字母数字字符# \s表示任何空格字符# \d表示任何十进制数字# +表示匹配1次或多次前面出现的正则表达# *表示匹配0次或多次前面出现的正则表达# (?:)表示一个匹配不用保存的分组 1.匹配最简单的邮箱格式,如[email protec

正则匹配中文问题

前两天,在公司做一个比较简单的姓名优化,但确在中文姓名这一块,确实为难了. 在网上找了好多的正则,都是能匹配中文及中文的符号,比如: , .之类 好在最后找到了一个比较好的,可以忽略符号的正则,分享给大家: $str = "一二二四五六七八九"; if( preg_match("/^[\x{4e00}-\x{9fa5}]{2,20}$/u",$str) ) // /u是指unicode编码处理 这个正则可以忽略符号.只匹配中文. { echo "<f

正则匹配中文字符

有如下字符: <li><a href="/song?id=185613">惊叹号</a></li><li><a href="/song?id=185614">迷魂曲</a></li> 怎么写正则才能匹配出" 迷魂曲"呢? 答: reg1 = /id=185614">([u4e00-\u9fa5]{3})<\/a>/g; va