中文的简单正则匹配

275次阅读
没有评论

原文链接 https://www.cnblogs.com/devcjq/articles/5059017.html

在 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, \l, \N, \P, \p, \U, \u, 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, $str, $m);
var_dump($m);
 
// 匹配中文····
$str = "erwerwe.·中文·匹配·324#¥%……";
$rule = "/([\x{4e00}-\x{9fa5}\·]{1,})/ius";
preg_match($rule, $str, $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 (中文) 

正文完
有偿技术支持加微信
post-qrcode
 0
评论(没有评论)
验证码