Javascript正则表达式返回true ..然后false ..然后是真等..等等

时间:2010-04-13 14:40:33

标签: javascript jquery html ajax regex

我在表单上写的验证有一个奇怪的问题。它是输入旁边的“检查用户名”按钮。输入默认值是用户名,例如'betamax'。当我按下“检查用户名”时,它会传递正则表达式并将用户名发送到服务器。服务器按预期运行并返回“2”以告诉javascript他们正在提交自己的用户名。

然后,当我再次单击该按钮时,正则表达式失败。由于正则表达式失败,显然没有任何内容发送到服务器。如果我再次按下该按钮,正则表达式将通过,然后将用户名发送到服务器。

我真的无法弄清楚它会做什么呢!这对我来说毫无意义!

编辑:我在Firefox和Chrome(mac)

中测试了这个问题

这是我的代码:

$j("#username-search").click(checkUserName);

function checkUserName() {
    var userName = $j("#username").val();


    var invalidUserMsg = 'Invalid username (a-zA-Z0-9 _ - and not - or _ at beginning or end of string)';
    var filter = /^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi;
    if (filter.test(userName)) {
        console.log("Pass")
        $j.post(
        "/account/profile/username_check/", 
        { q: userName }, 
        function(data){
            if(data == 0) {
                $j("#username-search-results").html("Error searching for username. Try again?");
            }
            else if(data == 5) {
                $j("#username-search-results").html(invalidUserMsg);
            }
            else if(data == 4) {
                $j("#username-search-results").html("Username too short or too long.");
            }
            else if(data == 2) {
                $j("#username-search-results").html("This is already your username.");
            }
            else if(data == 3) {
                $j("#username-search-results").html("This username is taken.");
            }
            else if(data == 1){
                $j("#username-search-results").html("This username is available!");
            }
        });
    } else {
        console.log("fail")
        $j("#username-search-results").html(invalidUserMsg);
    }

    return false;

}

HTML:

<input name="username" id="username" value="{{ user.username }}" />
<input type="button" value="Is it taken?" id="username-search">
<span id="username-search-results"></span>

2 个答案:

答案 0 :(得分:166)

/^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi;

您正在使用g(全局)RegExp。在JavaScript中,全局regexen具有状态:您第一次调用它们(使用exectest等),您将获得给定字符串中的第一个匹配项。再次调用它们,然后你得到下一个匹配,依此类推,直到你得不到匹配,并重置为下一个字符串的开头。您也可以写regex.lastIndex= 0来重置此状态。

(这当然是一个绝对可怕的设计,保证会混淆并导致奇怪的错误。欢迎使用JavaScript!)

您可以省略g中的RegExp,因为您只测试了一场比赛。

另外,我认为你不需要[^-_]正面和背面。这将允许每端的任何字符,即。 *plop!有效。您可能正在考虑前瞻/后瞻断言,但它们在JavaScript中不可用。 (好吧,前瞻应该是,但它在IE中被破坏了。)建议:

/^[a-z0-9][a-z0-9_-]{2,18}[a-z0-9]$/i

答案 1 :(得分:2)

[a-z0-9-_]

这是错误的,最后-必须在开头或结尾。

[a-z0-9_-]

这是否会导致这个问题,我不知道。

附加说明:

第一个和最后一个字符可以是任何不是-_的字符,而不是仅限于a-z0-9

a-z0-9不包含大写字符。你需要a-zA-Z0-9。 在大多数RegEx引擎中,a-zA-Z0-9_可以缩短为\w。我还没有在JavaScript中尝试过它。