Question

J'écris donc un formulaire d'inscription et j'ai besoin que le nom d'affichage ne soit composé que de chiffres, de lettres et de traits de soulignement.

Jetez un œil à mon code et dites-moi ce que je fais de 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>

Il a évidemment été réduit pour ne rien inclure qui ne soit pas lié au problème, mais même cet extrait ne fonctionne pas.

Était-ce utile?

La solution

Votre expression régulière

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

Cherche des

  1. Début de chaîne (vérification), suivi de
  2. 1 ou plusieurs lettres, chiffres ou traits de soulignement (cocher)

Et puis, ce qui vient après n'a pas d'importance.Cette expression régulière correspondra à n'importe quoi tant qu'elle commence par une lettre, un chiffre ou un trait de soulignement.

Si tu mets un $ à la fin, alors ça marchera - $ correspond à la "fin de chaîne", donc la seule façon pour cela de correspondre est s'il y a seulement chiffres, lettres et traits de soulignement entre le début et la fin de la chaîne.

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

Deuxièmement, je suggère d'utiliser document.getElementById('display-name').value au lieu de document.forms car il ne se cassera pas si vous réorganisez le HTML et constitue davantage « la norme communément acceptée de ce qu'il faut faire »

Autres conseils

Mon expression rationnelle irait dans le sens de : /^[a-zA-Z0-9_]+$/

modifier:Je pense que c'est l'absence de fin de ligne $ cela le fait échouer.

Que signifie « ne fonctionne pas » ?Est-ce qu'il rejette les noms d'affichage valides ?Accepte-t-il les noms d'affichage invalides ?Lesquels?

Par @Annan, en laissant de côté le $ ferait en sorte que l'expression rationnelle accepte des noms d'affichage invalides comme abc123!@#.

Si le code rejette les noms d'affichage valides, c'est peut-être parce que les parenthèses correspondent littéralement au lieu de désigner un groupe (je ne suis pas sûr de la convention de citation dans JS).

Une façon plus simple de l'écrire serait encore

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

Encore plus simple :

var name_regex = /^\w+$/;

J'ai testé votre script et manipulé le javascript.Cela semble fonctionner :

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

Désolé les gars, j'aurais dû être plus précis.Chaque fois que j'ajoutais des espaces, les valeurs étaient toujours acceptées.Le signe dollar $ j'ai fait l'affaire !

Par «ne fonctionne pas», je suppose que vous voulez dire qu'il laisse passer les entrées invalides (plutôt que de ne pas laisser passer les entrées valides).

Comme @Annan l'a dit, cela serait probablement dû au manque de $ caractère à la fin de l'expression, car actuellement, il ne nécessite qu'un seul caractère valide au début de la valeur, et le reste peut être n'importe quoi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top