81 votos

Javascript regex devuelve true.. entonces falso.. entonces cierto.. etc

Tengo un extraño problema con la validación estoy escribiendo en un formulario. Es un nombre de Usuario' botón que se encuentra junto a una entrada. La entrada valor por defecto es el nombre de usuario, por ejemplo "betamax'. Al pulsar "Comprobar nombre de Usuario' pasa la regex y envía el nombre de usuario para el servidor. El servidor se comporta como se espera y devuelve '2' para contar el javascript que están presentando su propio nombre de usuario.

Entonces, cuando hago clic en el botón de nuevo, el regex falla. Nada es enviado al servidor, obviamente, porque el regex ha fallado. Si pulsa el botón de nuevo, la expresión regular que pasa y, a continuación, el nombre de usuario se envía al servidor.

Yo, literalmente, no puede averiguar qué sería lo que es hacer esto! No tiene sentido para mí!

Edit: he probado el problema en Firefox y Chrome (mac)

Este es mi código:

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

}

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

151voto

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

Usted está utilizando un g (global) RegExp. En JavaScript, global regexen han estado: se llama a ellos (con exec, test etc.) la primera vez, consigue el primer partido en una determinada cadena. Llame de nuevo y se obtiene el siguiente partido, y así sucesivamente hasta obtener ningún partido y se restablece el inicio de la siguiente cadena. También puede escribir regex.lastIndex= 0 para el restablecimiento de este estado.

(Esta es, por supuesto, absolutamente terrible pieza de diseño, garantizado para confundir y causar errores extraños. Bienvenido a JavaScript!)

Se puede omitir la g de su RegExp, puesto que son sólo pruebas para un partido.

Además, no creo que quieras [^-_] en la parte delantera y la espalda. Que permitirá a cualquier personaje en cada extremo, es decir,. *plop! sería válida. Probablemente estás pensando de búsqueda hacia delante/declaraciones de búsqueda hacia atrás, pero no están disponibles en JavaScript. (Bueno, oteo se supone que es, pero es roto en IE.) Sugiero que en vez:

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

2voto

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

Esto está mal, La última - debe ser al principio o al final.

[a-z0-9_-]

Si que podría causar este problema o no, no sé.

Notas adicionales:

La primera y la última están permitidos los caracteres a ser cualquier carácter que no es - o _ en lugar de limitarse a a-z0-9

a-z0-9 no se incluyen los caracteres en mayúsculas. Usted necesita a-zA-Z0-9 para que. a-zA-Z0-9_ puede ser reducido a \w en la mayoría de los RegEx motores. Yo no lo he probado en JavaScript.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X