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: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 (日文)

时间: 2024-11-10 00:50:12

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

php正则表达匹配中文问题分析小结_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:wwwrootp

日期格式-vc regex 正则表达匹配日期

问题描述 vc regex 正则表达匹配日期 vc使用regex实现一个与"2015/05/12"这样日期格式匹配的功能,用最简单的正则式""d{4}/d{12}/d{12}""都匹配不通过. 然后只匹配"2015",用"20dd""不行,用"20d*""却可以 求破 解决方案 ""20dd""有没有打双斜杠? 解决方案二: 语

协议解析-python中的正则表达匹配问题

问题描述 python中的正则表达匹配问题 20C ma = re.search(r""^x00x00x00x00x0d"" tcpapp[9:]) 请问这句是什么意思?? 是在qq报文解析中的程序片段. x00x00x00x00x0d如何理解 解决方案 看下基本原则吧 http://m.blog.csdn.net/article/details?id=49151633 解决方案二: Search(patternstringflags=0)方法在一个字符中查找匹配(

PHP 正则匹配中文

在做表单验证时对用户姓名的验证规则有以下要求 要求:输入的内容需要满足的条件是: 1.允许输入字符:数字(0-9).字母(a-z和A-Z).汉字.下划线(_).圆点(.)和空格: 2.姓名中间允许有空格: 3.下划线.圆点和空格均为英文状态输入法下的字符: 4.姓名前后不允许输入下划线.圆点.空格和特殊字符 $str = 'abc测试 ef'; if (preg_match('/^[a-zA-Z0-9\u4e00-\u9fa5]+$|^[a-zA-Z0-9\u4e00-\u9fa5][a-zA-

分析网页的内容,除正则表达之外还有其他什么方法?

问题描述 分析网页的内容,除正则表达之外还有其他什么方法?请问一下,这个网页标题和内容的正则表达示怎么写呢?http://news.sina.com.cn/c/2007-04-11/161112753911.shtml 解决方案 解决方案二:UP解决方案三:还有啊,比入字符串的indexOf(),,lastIndexOf()...等等...************************************************想不出短信?来http://www.9gaoxiao.com解

js实现正则匹配中文标点符号的方法_javascript技巧

本文实例讲述了js正则匹配中文标点符号的方法.分享给大家供大家参考,具体如下: 运行效果截图如下: 具体代码如下: <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>js正则匹配中文标点符号</title> <head> <body> <input ty

oracle 正则表达分析说明与数字正则(1/2)

    方括号表达示 方括号表达式 描述 [[:alnum:]] 字母和数字混合的字符 [[:alpha:]] 字母字符 [[:cntrl:]] 控制字符 [[:digit:]] 数字字符 [[:graph:]] 图像字符 [[:lower:]] 小写字母字符 [[:print:]] 打印字符 [[:punct:]] 标点符号字符 [[:space:]] 空格字符 [[:upper:]] 大写字母字符 [[:xdigit:]] 十六进制数字字符   l        元字符 元字符 描述 *?

这个js的正则表达为什么搞不动用innerHTML得到字符串?

问题描述 各位大侠,帮忙看下这个js的正则表达为什么搞不动用innerHTML得到字符串?用var tStr = "https:2222";都可以搞,用innerHTML得到字符串就搞不动,这是为神码?<html><head><script language="javascript" type="text/javascript" src="demo.js" >https:1111 https

常用正则表达

今天收藏了大量的正则表达试代码,我想这想这些都是常用的会对各位朋友们有用的.下面来看看吧.       匹配特定字符串:       ^[A-Za-z]+$ //匹配由26个英文字母组成的字符串       ^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串       ^[a-z]+$ //匹配由26个英文字母的小写组成的字符串       ^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串       ^w+$ //匹配由数字.26个英文字母或者下划线组成的字