Heim > Backend-Entwicklung > PHP-Tutorial > php正则表达匹配中文有关问题分析

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

WBOY
Freigeben: 2016-06-13 12:28:57
Original
877 Leute haben es durchsucht

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

$str = '中华人民共和国123456789abcdefg';<br>echo preg_match("/^[u4e00-u9fa5_a-zA-Z0-9]{3,15}$",$strName);
Nach dem Login kopieren



 

运行一下上面这段代码,看会有什么提示信息?
 
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);<br><br><br>preg_match('/[x{2460}-x{2468}]/u', $str);
Nach dem Login kopieren


 

匹配 内码汉字
按照他提供的方式进行测试,代码如下:

 代码如下 复制代码 

$str = "php编程";<br>if (preg_match("/^[x{2460}-x{2468}]+$/u",$str)) {<br>print("该字符串全部是中文");<br>} else {<br>print("该字符串不全部是中文");<br>}
Nach dem Login kopieren


 

发现这次依然对是否为中文判断失常。不过,既然x表示的十六进制数据,为什么和js里边提供的范围x4e00-x9fa5不一样呢?于是我就换成了下边的代码:

$str = "php编程";<br>if (preg_match("/^[x4e00-x9fa5]+$/u",$str)) {<br>print("该字符串全部是中文");<br>} else {<br>print("该字符串不全部是中文");<br>}
Nach dem Login kopieren


 

本来以为铁定成功了的事情,没想到,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编程";<br>if (preg_match("/^[x{4e00}-x{9fa5}]+$/u",$str)) {<br>print("该字符串全部是中文");<br>} else {<br>print("该字符串不全部是中文");<br>}<br> 
Nach dem Login kopieren
复制代码


知道了php中utf-8编码下用正则表达式匹配汉字的最终正确表达式——/^[x{4e00}-x{9fa5}]+$/u,

最后总结出

//if (preg_match(“/^[".chr(0xa1)."-".chr(0xff)."]+$/”, $str)) { //只能在GB2312情况下使用<br>if (preg_match(“/^[x7f-xff]+$/”, $str)) { //兼容gb2312,utf-8<br>echo “正确输入”;<br>} else {<br>echo “错误输入”;<br>}
Nach dem Login kopieren


 

双字节字符编码范围

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

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage