101 votes

Javascript regex retourner vrai.. alors faux.. alors vrai.. etc

J'ai un problème étrange avec la validation, je suis en train d'écrire sur un formulaire. C'est un nom d'utilisateur' bouton à côté de l'entrée. L'entrée valeur par défaut est le nom d'utilisateur par exemple "betamax'. Lorsque j'appuie sur 'Vérifier le nom d'utilisateur' il passe la regex et envoie le nom d'utilisateur pour le serveur. Le serveur se comporte comme prévu et retourne '2' à dire le code javascript qui ils soumettent leur propre nom d'utilisateur.

Puis, lorsque je clique sur le bouton de nouveau, la regex échoue. Rien n'est envoyé au serveur, évidemment, parce que la regex a échoué. Si j'appuie sur le bouton de nouveau, la regex passes et puis le nom d'utilisateur est envoyé au serveur.

J'ai littéralement ne peut pas comprendre ce qui permettrait de faire cela! 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;

}

Le code 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>

196voto

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

Vous êtes à l'aide d'un g (global) RegExp. En JavaScript, global regexen de l'état: vous appelez eux (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 à l' regex.lastIndex= 0 pour réinitialiser cet état.

(Bien sûr ce n'est absolument terrible morceau de la conception, de la garantie à confondre et à cause des erreurs étranges. Bienvenue sur le JavaScript!)

Vous pouvez omettre l' g de votre RegExp, puisque vous êtes les seuls tests pour un match.

Aussi, je ne pense pas que vous souhaitez [^-_] à l'avant et à l'arrière. Qui permettra à tout caractère à chaque extrémité, c'est à dire. *plop! serait valide. Vous pensez probablement d'anticipation/les assertions arrières, mais ils ne sont pas disponibles en JavaScript. (Eh bien, d'anticipation est censé être, mais elle est cassée dans IE.) Suggérer à la place:

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

2voto

Powerlord Points 43989
[a-z0-9-_]

C'est faux, La dernière - doit être au début ou à la fin.

[a-z0-9_-]

Si ce serait l'origine de ce problème ou pas, je ne sais pas.

Notes supplémentaires:

Les premiers et derniers caractères sont autorisés à être n'importe quel caractère qui n'est pas - ou _ plutôt que d'être restreint à l' a-z0-9

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X