Javascript regex renvoyer true.. alors faux.. alors vrai.. etc [dupliquer]

cette question a déjà une réponse ici:

j'ai un étrange problème avec la validation que j'écris sur un formulaire. C'est un nom d'utilisateur' bouton à côté de l'entrée. L'entrée valeur par défaut est la nom d'utilisateur par exemple "betamax'. Lorsque j'appuie sur 'Check Username', il passe le regex et envoie le nom d'utilisateur au serveur. Le serveur se comporte comme prévu et renvoie '2' pour dire au javascript qu'il soumet son propre nom d'utilisateur.

puis, quand je clique à nouveau sur le bouton, le regex échoue. Rien n'est envoyé au serveur évidemment parce que le regex a échoué. Si j'appuie à nouveau sur le bouton, le regex passe et le nom d'utilisateur est envoyé au serveur.

Je n'arrive pas à comprendre ce qui le ferait faire ça! Il ne fait aucun sens pour moi!

Edit: j'ai testé le problème dans Firefox et Chrome (mac)

C'est mon code:

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

}

the 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>
79
demandé sur betamax 2010-04-13 18:40:32

2 réponses

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

vous utilisez un g (global) RegExp . Dans JavaScript, global regexen ont état: vous les appelez (avec exec , test etc.) la première fois, vous obtenez le premier match dans une chaîne donnée. Appeler de nouveau et vous obtenez le prochain match, et ainsi de suite jusqu'à ce que vous n'obtenez pas de match et il réinitialise le début de la chaîne suivante. Vous pouvez aussi écrire regex.lastIndex= 0 pour réinitialiser cet état.

(ceci est bien sûr une pièce absolument terrible de design, garanti de confondre et de causer des erreurs bizarres. Bienvenue à JavaScript!)

vous pouvez omettre le g de votre RegExp , car vous ne testez que pour une correspondance.

Aussi, je ne pense pas que vous voulez [^-_] à l'avant et à l'arrière. Cela permettra n'importe quel caractère à chaque extrémité, c.-à-d.. *plop! serait valable. Vous pensez probablement à lookahead / lookbehind assertions, mais ils ne sont pas disponibles en JavaScript. (Eh bien, lookahead est supposé l'être, mais il est cassé en mi.) Suggérez plutôt:

/^[a-z0-9][a-z0-9_-]{2,18}[a-z0-9]$/i
144
répondu bobince 2010-04-13 15:01:46
[a-z0-9-_]

c'est mal, le dernier - doit être au début ou à la fin.

[a-z0-9_-]

que cela cause ce problème ou Non, Je ne sais pas.

Notes complémentaires:

le premier et le dernier caractère sont autorisés à être n'importe quel caractère qui n'est pas - ou _ plutôt que d'être limité à a-z0-9

a-z0-9 ne comprend pas des caractères en majuscules. Vous avez besoin de a-zA-Z0-9 pour cela. a-zA-Z0-9_ peut être abrégé en \w dans la plupart des moteurs RegEx. Je ne l'ai pas essayé en JavaScript.

2
répondu Powerlord 2010-04-13 14:49:52