用户名正则表达式验证问题

时间:2013-09-19 20:25:59

标签: javascript regex

我在发帖之前搜索了SO,但找不到对我有用的答案。

下面是一个用于测试用户名的简单JS脚本。

用户名长度验证工作正常但字符验证不会:

所有不允许的字符(例如$%; [+))都会通过,但它们应该返回错误。

<script type="text/javascript">
 $(document).ready(function() {
    $("#username").change(function() {
        var username = $("#username").val();
        var msgbox = $("#status");
        var usernameRegex = /^[a-zA-Z0-9][a-zA-Z0-9\._-]$i/

         if ((username.length >= 4 && username.length <= 20) &&  
 (usernameRegex.test(username.value) == false)) {

            $.ajax({
                type: "POST",
                url: "username.php",
                data: "username=" + username,
                success: function(msg) {

                    if (msg == 'OK') {

                        msgbox.html('<img src="ok.png">');

                    } else {
                        msgbox.html(msg);
                    }
                }
             });
        } else {

            $("#status").html('<img src="no.png">Try again');
        }
     });
});
</script>

我错过了什么?

3 个答案:

答案 0 :(得分:1)

您正在向后检查测试结果。如果模式匹配,test()方法将返回true。而且你正在检查虚假价值。

将其更改为:

if ((username.length >= 4 && username.length <= 20) 
    &&  usernameRegex.test(username.value)) {

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FRegExp%2Ftest

答案 1 :(得分:1)

/^[a-zA-Z0-9][a-zA-Z0-9\._-]{4,20}$i/
                                  ^^
                        Here is the problem

您可能想要指定不区分大小写的标志,但不小心将i放在正则表达式模式本身中,您需要将表达式修改为:

/^[a-zA-Z0-9][a-zA-Z0-9\._-]{4,20}$/i

并且他们已经指出你应该测试一个true条件,换句话说,你需要检查字符串是否与模式匹配,因此只包含你允许的字符。

答案 2 :(得分:1)

您的正则表达式存在问题,而且不仅仅是$i/。你有:

var usernameRegex = /^[a-zA-Z0-9][a-zA-Z0-9\._-]$i/;

第二个令牌[a-zA-Z0-9\._-]仅评估一次。它检查第一个标记的第一个字符,然后检查第二个标记的第二个字符,然后$而期望字符串结束。即使将测试条件更改为true并修复其余逻辑,原始正则表达式也会失败超过两个字符的所有用户名。

请改为尝试:

var usernameRegex = /^[a-zA-Z0-9][a-zA-Z0-9\._-]+$/i;

+确保正则表达式会在令牌中查找至少一个字符,并匹配它们直到字符串结束。

最后,正如其他人所提到的,您需要usernameRegex.test(username)而不是usernameRegex.test(username.value),并且需要测试true值,而不是false

See a working demo here.