web-dev-qa-db-ja.com

true ..、false ..、true ..などを返すJavascript正規表現

フォームに書いている検証に奇妙な問題があります。これは、入力の横にある[ユーザー名の確認]ボタンです。入力のデフォルト値は、「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>
106
betamax
/^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi;

g(グローバル)RegExpを使用しています。 JavaScriptでは、グローバル正規表現に状態があります。最初にそれらを(exectestなどで)呼び出すと、指定された文字列で最初に一致した文字列が取得されます。再度呼び出して、次の一致を取得します。一致が取得されず、次の文字列の先頭にリセットされるまで続きます。この状態をリセットするには、regex.lastIndex= 0と書くこともできます。

(もちろん、これは絶対に恐ろしいデザインであり、混乱して奇妙なエラーを引き起こすことが保証されています。JavaScriptへようこそ!)

gからRegExpを省略することができます。これは、1つの一致のみをテストしているためです。

また、[^-_]が前面と背面にあるとは思わない。つまり、各端にany文字が許可されます。 *plop!は有効です。おそらく先読み/後読みのアサーションを考えているのでしょうが、JavaScriptでは利用できません。 (まあ、lookaheadはあるはずですが、IEでは壊れています。)代わりに提案してください:

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

これは間違っています。最後の-は先頭または末尾でなければなりません。

[a-z0-9_-]

それがこの問題を引き起こすかどうか、私にはわかりません。

その他の注意事項:

最初と最後の文字は、-に制限されるのではなく、_またはa-z0-9ではない任意の文字にすることができます

a-z0-9には大文字は含まれません。そのためにはa-zA-Z0-9が必要です。 a-zA-Z0-9_は、ほとんどのRegExエンジンで\wに短縮できます。 JavaScriptで試したことはありません。

2
Powerlord