前言

之前突然感兴趣写的一个三合一收款码程序,因为就是玩玩,密码验证什么的我都没有太在意,纯数字都可以,随着用户越来越多感觉密码有点弱,今下午就想着改一下验证规则,想来想去就觉得QQ密码的验证还不错@(呵呵),于是就去QQ注册官网提取了一下正则,先用先放在网页注册js里面测试,验证通过都没问题,于是开始放服务器端验证,直接给我报了个错,我之前也没在意,于是去搜索了一下,发现js和PHP的正则还是有一点区别的
原来,PHP正则表达式中不支持下列 Perl 转义序列:

\L, \l, \N, \P, \p, \U, \u, or \X 

PHP 正则表达式验证中文的问题,感觉php不支持perl转义挺讨厌的。

解决问题

$str = '教书先生博客blog.oioweb.cn'; 
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:\wwwroot\php\test.php on line 2 

在 UTF-8 模式下,允许用“\x{...}”,花括号中的内容是表示十六进制数字的字符串。原来的十六进制转义序列 \xhh 如果其值大于 127 的话则匹配了一个双字节 UTF-8 字符。
所以,可以这样来解决:

preg_match("/^[\x80-\xff_a-zA-Z0-9]{3,15}$",$strName); 

代码如下:

<?php 
$shouji ="教书先生博客带给你想看的"; 
if (!preg_match("/^[\x80-\xff]{6,30}$/",$shouji)){ 
    echo "nonono";     
} 
else { 
    echo "yesyesyes"; 
} 
?>

放一下我的密码验证正则吧:(8-16位密码,不包含空格,必须包含数字,字母或字符至少两种))
js的:

<script>
    checkPassword("教书先生博客:blog.oioweb.cn");
    function checkPassword(password)
    {
        var reg=/(?!.*\s)(?!^[\u4e00-\u9fa5]+$)(?!^[0-9]+$)(?!^[A-z]+$)(?!^[^A-z0-9]+$)^.{8,16}$/;
        if(!reg.test(password))
        {
            alert("8-16位密码,不包含空格,必须包含数字,字母或字符至少两种!");
            document.form.password.focus();
            return false;
        }
        return true;
    }
</script>

PHP的:

<?php
$srt = "教书先生博客:blog.oioweb.cn";
if (preg_match('/(?!.*\s)(?!^[\x80-\xff]{6,30}$)(?!^[0-9]+$)(?!^[A-z]+$)(?!^[^A-z0-9]+$)^.{8,16}$/',$srt)){
    echo "yes";
} else{
    echo "NO";
}
?>

希望对大家有所帮助!

最后修改:2020 年 11 月 12 日
如果觉得我的文章对你有用,请随意赞赏