フォームに書いている検証に奇妙な問題があります。これは、入力の横にある[ユーザー名の確認]ボタンです。入力のデフォルト値は、「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>
/^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi;
g
(グローバル)RegExp
を使用しています。 JavaScriptでは、グローバル正規表現に状態があります。最初にそれらを(exec
、test
などで)呼び出すと、指定された文字列で最初に一致した文字列が取得されます。再度呼び出して、次の一致を取得します。一致が取得されず、次の文字列の先頭にリセットされるまで続きます。この状態をリセットするには、regex.lastIndex= 0
と書くこともできます。
(もちろん、これは絶対に恐ろしいデザインであり、混乱して奇妙なエラーを引き起こすことが保証されています。JavaScriptへようこそ!)
g
からRegExp
を省略することができます。これは、1つの一致のみをテストしているためです。
また、[^-_]
が前面と背面にあるとは思わない。つまり、各端にany文字が許可されます。 *plop!
は有効です。おそらく先読み/後読みのアサーションを考えているのでしょうが、JavaScriptでは利用できません。 (まあ、lookaheadはあるはずですが、IEでは壊れています。)代わりに提案してください:
/^[a-z0-9][a-z0-9_-]{2,18}[a-z0-9]$/i
[a-z0-9-_]
これは間違っています。最後の-
は先頭または末尾でなければなりません。
[a-z0-9_-]
それがこの問題を引き起こすかどうか、私にはわかりません。
その他の注意事項:
最初と最後の文字は、-
に制限されるのではなく、_
またはa-z0-9
ではない任意の文字にすることができます
a-z0-9
には大文字は含まれません。そのためにはa-zA-Z0-9
が必要です。 a-zA-Z0-9_
は、ほとんどのRegExエンジンで\w
に短縮できます。 JavaScriptで試したことはありません。