在PHP中使用正则匹配中文,很多时候会出现问题,在不同的编码情况下,正则表达式不太一样,所以希望大家注意,在使用正则匹配中文的时候,多多注意编码问题。
在JS下能够使用的在PHP中不一定可以使用,比如:/^[a-zA-Z0-9\_\.\_\.\u4E00-\u9FA5\uF900-\uFA2D]+$/;
如果在PHP中使用 :\u4E00-\u9FA5\uF900-\uFA2D 来匹配,那么会在运行PHP脚本的时候出现错误,
Warning: preg_match(): Compilation Failed: PCRE does not support \L,\l,\N,\P,\p,\U,\u,or \X at offset 6
那是因为:PHP正则表达式中不支持下列 Perl 转义序列:\L,or \X
但是在在 UTF-8 模式下,允许用“\x{...}”,花括号中的内容是表示十六进制数字的字符串,一下给出了一个简单的中文匹配示例:
//匹配中文、英文字符、数字、特殊符号全角除外 $str='adf^^**^k2)(*&3423sfdgsdf#$%^423jkalk阿拉丁解放路dsfj'; $rule="/([\x80-\xff]{1,})/"; echo"<pre>"; preg_match_all("/([?=[\x21-\x7e]{1,}|[A-Za-z0-9]{1,}|[\x{4e00}-\x{9fa5}]{1,})/u",$str,$m); var_dump($m); //支持特殊符号(半角) $rule="/((?=[\x21-\x7e])[^A-Za-z0-9]){1,}/u"; preg_match($rule,$m); var_dump($m); //匹配中文・・・・ $str="erwerwe.・中文・匹配・324#¥%……"; $rule="/([\x{4e00}-\x{9fa5}\・]{1,})/ius"; preg_match($rule,$m); var_dump($m); //匹配邮件 $email="qwerty234234@234567_#$%@yahoo.cn"; //$email="bieru52@aliyun.com"; $rule="/(^[a-zA-Z0-9][a-zA-Z0-9\.\_\-]{1,30}@[a-zA-Z0-9_-]{1,10}(\.[a-zA-Z0-9_-]{1,10}){0,4})\.[a-zA-Z]{1,10}$/"; $m=preg_match($rule,$email); var_dump($m);
双字节字符编码范围
GBK (GB2312/GB18030)
x00-xff GBK双字节编码范围
x20-x7f ASCII
xa1-xff 中文 gb2312
x80-xff 中文 gbk
UTF-8 (Unicode)
u4e00-u9fa5 (中文)
参考文档:正则表达式30分钟入门教程