0

我在发布之前搜索了 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>

我错过了什么?

4

3 回答 3

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

于 2013-09-19T20:30:38.890 回答
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条件,或者换句话说,你需要检查字符串是否真的与模式匹配,因此只包含你允许的字符。

于 2013-09-19T20:30:54.947 回答
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

在此处查看工作演示。

于 2013-09-19T20:37:09.587 回答