代码之家  ›  专栏  ›  技术社区  ›  betamax

javascript regex返回true..那就错了……然后是真的……等[副本]

  •  85
  • betamax  · 技术社区  · 14 年前

    这个问题已经有了答案:

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

    然后,当我再次单击按钮时,regex失败。显然,没有任何内容发送到服务器,因为regex失败了。如果我再次按下按钮,regex将通过,然后用户名将被发送到服务器。

    我真的搞不清是什么让它这么做的!这对我来说毫无意义!

    编辑:我在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 回复  |  直到 14 年前
        1
  •  159
  •   bobince    14 年前
    /^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi;
    

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

    (这当然是一个非常可怕的设计,一定会混淆并导致奇怪的错误。欢迎使用javascript!)

    你可以省略 G 从您的 正则表达式 因为你只测试一场比赛。

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

    /^[a-z0-9][a-z0-9_-]{2,18}[a-z0-9]$/i
    
        2
  •  2
  •   Powerlord    14 年前
    [a-z0-9-_]
    

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

    [a-z0-9_-]
    

    我不知道这是否会引起这个问题。

    附加说明:

    第一个和最后一个字符可以是任何不是 - _ 而不是被限制在 a-z0-9

    A Z0—9 不包括大写字符。你需要 a-zA-Z0-9 为了这个。 a-zA-Z0-9_ 可以缩短为 \w 在大多数Regex引擎中。我还没有在javascript中尝试过。