Pertanyaan Javascript regex mengembalikan true .. then false .. then true .. etc [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Saya memiliki masalah aneh dengan validasi yang saya tulis di formulir. Ini adalah tombol 'Periksa Nama Pengguna' di sebelah masukan. Nilai default input adalah nama pengguna misalnya 'betamax'. Ketika saya menekan 'Periksa Nama Pengguna', melewati regex dan mengirimkan nama pengguna ke server. Server berperilaku seperti yang diharapkan dan mengembalikan '2' untuk memberi tahu javascript bahwa mereka mengirimkan nama pengguna mereka sendiri.

Kemudian, ketika saya mengklik tombol lagi, regex gagal. Tidak ada yang dikirim ke server karena regex gagal. Jika saya menekan tombol lagi, regex berlalu dan kemudian nama pengguna dikirim ke server.

Saya benar-benar tidak tahu apa yang akan membuatnya melakukan ini! Tidak masuk akal bagiku!

Edit: Saya telah menguji masalah di Firefox dan Chrome (mac)

Ini adalah kode saya:

$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>

76
2018-04-13 14:40


asal


Jawaban:


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

Anda menggunakan file g (global) RegExp. Dalam JavaScript, global regexen memiliki status: Anda memanggilnya (dengan exec, test dll.) pertama kali, Anda mendapatkan pertandingan pertama dalam string yang diberikan. Panggil mereka lagi dan Anda mendapatkan pertandingan berikutnya, dan seterusnya sampai Anda tidak menemukan kecocokan dan itu ulang ke awal dari string berikutnya. Anda juga bisa menulis regex.lastIndex= 0 untuk mengatur ulang status ini.

(Ini tentu saja desain yang benar-benar mengerikan, dijamin membingungkan dan menyebabkan kesalahan aneh. Selamat datang di JavaScript!)

Anda dapat menghilangkan g dari kamu RegExp, karena Anda hanya menguji untuk satu pertandingan.

Juga, saya tidak berpikir Anda inginkan [^-_] di depan dan belakang. Itu akan memungkinkan apa saja karakter di setiap akhir, yaitu. *plop! akan berlaku. Anda mungkin berpikir tentang pernyataan lookahead / lookbehind, tetapi mereka tidak tersedia di JavaScript. (Yah, lookahead seharusnya, tapi rusak di IE.) Sarankan sebagai gantinya:

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

140
2018-04-13 14:54



[a-z0-9-_]

Ini salah, yang terakhir - harus di awal atau akhir.

[a-z0-9_-]

Apakah itu akan menyebabkan masalah ini atau tidak, saya tidak tahu.

Catatan tambahan:

Karakter pertama dan terakhir dibolehkan menjadi karakter apa pun yang tidak - atau _ bukannya dibatasi a-z0-9

a-z0-9 tidak menyertakan karakter huruf besar. Anda butuh a-zA-Z0-9 untuk itu. a-zA-Z0-9_ dapat disingkat menjadi \w di sebagian besar mesin RegEx. Saya belum mencobanya di JavaScript.


2
2018-04-13 14:44