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

正規表現に問題があり、. だけではありません$i/。あなたが持っている:

var usernameRegex = /^[a-zA-Z0-9][a-zA-Z0-9\._-]$i/;

その 2 番目のトークン[a-zA-Z0-9\._-]は 1 回だけ評価されます。最初のトークンの最初の文字をチェックし、次に 2 番目のトークンの 2 番目の文字をチェック$. テスト条件を変更しtrueて残りのロジックを修正した後でも、元の正規表現は2 文字を超えるすべてのユーザー名で失敗します。

代わりにこれを試してください:

var usernameRegex = /^[a-zA-Z0-9][a-zA-Z0-9\._-]+$/i;

これ+により、正規表現がトークン内の少なくとも 1 つの文字を検索し、文字列が終了するまで一致することが保証されます。

最後に、他の人が述べたように、usernameRegex.test(username)代わりにが必要であり、 ではなく値usernameRegex.test(username.value)をテストする必要があります。truefalse

ここで動作するデモを参照してください。

于 2013-09-19T20:37:09.587 に答える
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 に答える