Pregunta

Entonces, estoy escribiendo un formulario de registro y necesito que el nombre para mostrar sea solo números, letras y guiones bajos.

Echa un vistazo a mi código y dime qué estoy haciendo mal.

<form method="post" action="/" onsubmit="return check_form()">
    <input type="text" id="display-name" name="display-name" maxlength="255" />
    <input type="submit" />
</form>
<script type="text/javascript">
<!--
    var name_regex = /^([a-zA-Z0-9_])+/

    function check_form()
    {
        if (!name_regex.test(document.forms[0].elements[0].value))
        {
            document.forms[0].elements[0].focus()
            alert("Your display name may only contain letters, numbers and underscores")
            return false
        }
    }
-->
</script>

Obviamente se ha recortado para no incluir nada que no esté relacionado con el problema, pero ni siquiera este fragmento funciona.

¿Fue útil?

Solución

Tu expresión regular

/^([a-zA-Z0-9_])+/

Busca

  1. Inicio de la cadena (verificar), seguido de
  2. 1 o más letras, números o guión bajo (marcar)

Y luego, lo que venga después, no importa.Esta expresión regular coincidirá con cualquier cosa siempre que comience con una letra, un número o un guión bajo.

Si pones un $ al final, entonces funcionará. $ coincide con el 'fin de la cadena', por lo que la única forma de que coincida es si hay solo números, letras y guiones bajos entre el inicio y el final de la cadena.

/^([a-zA-Z0-9_])+$/

En segundo lugar, sugeriría usar document.getElementById('display-name').value en lugar de document.forms ya que no se romperá si reorganiza el HTML y es más bien "el estándar comúnmente aceptado sobre qué hacer"

Otros consejos

Mi expresión regular sería similar a: /^[a-zA-Z0-9_]+$/

editar:Creo que es la falta de un final de línea. $ eso lo hace fallar.

¿Qué significa "no funciona"?¿Rechaza nombres para mostrar válidos?¿Acepta nombres para mostrar no válidos?¿Cuáles?

Según @Annan, dejando de lado el $ haría que la expresión regular acepte nombres para mostrar no válidos como abc123!@#.

Si el código rechaza nombres para mostrar válidos, puede deberse a que los paréntesis coinciden literalmente en lugar de indicar un grupo (no estoy seguro de la convención de comillas en JS).

Una forma más sencilla de escribirlo aún sería

var name_regex = /^([a-z0-9_])+$/i;

Aún más simple:

var name_regex = /^\w+$/;

Probé tu script y me entrometí con javascript.Esto parece funcionar:

<form method="post" action="/" onsubmit="return check_form()">
    <input type="text" id="display-name" name="display-name" maxlength="255" />
    <input type="submit" />
</form>
<script type="text/javascript">
    <!--
    var name_regex = /^([a-zA-Z0-9_])+$/;

    function check_form()
    {
        if (!name_regex.test(document.forms[0].elements[0].value))
        {
            document.forms[0].elements[0].focus();
            alert("Your display name may only contain letters, numbers and underscores");
            return false;
        }
    }
    -->
</script>

Lo siento chicos, debería haber sido más específico.Cada vez que agregaba espacios, los valores seguían siendo aceptados.el signo del dolar $ ¡Hizo el truco!

Cuando dice "no funciona", entiendo que quiere decir que permite el paso de entradas no válidas (en lugar de no permitir el paso de entradas válidas).

Como ha dicho @Annan, esto probablemente se debería a la falta de $ carácter al final de la expresión, ya que actualmente solo requiere un único carácter válido al comienzo del valor, y el resto puede ser cualquier cosa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top