2008-08-20 10 views
3

Donc, je suis en train d'écrire un formulaire d'inscription et j'ai besoin que le nom d'affichage ne soit que des chiffres, des lettres et des caractères de soulignement. Jetez un oeil à mon code et dites-moi ce que je fais mal.Qu'est-ce que j'ai fait de mal ici? [Javascript Regex]

<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 est évidemment été dégrossi de ne pas inclure quoi que ce soit non lié au problème, mais même cet extrait ne fonctionne pas.

Répondre

14

Votre regex

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

Attend pour

  1. Début de la chaîne (chèque), suivi par
  2. 1 ou plusieurs lettres, des chiffres ou soulignement (chèque)

Et puis tout ce qui vient après ça n'a pas d'importance. Cette expression rationnelle correspond à rien du tout tant qu'il commence par une lettre, un chiffre ou souligner

Si vous mettez un $ à la fin, il travaillera - $ matches de la fin de la chaîne », la seule façon il peut correspondre s'il y a seulement nombres, 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 est plus la norme de ce qu'il faut faire communément accepté '

+2

\ w est un raccourci pour la lettre, chiffres et caractères de soulignement. Je le simplifierais à/^ \ w + $/ –

+0

@Juan, dans la plupart des lanugages, ce qui compte comme un mot dépend du système et des paramètres régionaux, n'est-ce pas le cas dans JS? – tobyodavies

+0

La plupart des références RegEx listent simplement un raccourci vers [a-zA-Z_0-9]. Java: http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern. PHP utilise POSIX qui dit essentiellement la même chose. S'applique aussi à JS. '/\w/.test (" é ")' renvoie false lorsque mes paramètres régionaux sont définis sur pt-br. Je n'ai jamais entendu parler de \ w étant vraiment intelligent sur la détection d'autres paramètres régionaux. –

6

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

edit: Je pense qu'il est l'absence d'une fin de ligne $ qui fait échouer.

0

Par 'ne fonctionne pas' je suppose que cela signifie qu'il laisse passer les entrées invalides (plutôt que de laisser passer les entrées valides). Comme l'a dit @Annan, cela serait probablement dû à l'absence du 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.

0

Je vois la Il manque des points-virgules dans l'extrait (qui définit la fin de la ligne de code).

0

Que signifie "ne fonctionne pas"? Rejette-t-il les noms d'affichage valides? Accepte-t-il les noms d'affichage incorrects? Lesquels?

Per @Annan, en laissant le $ rendrait l'expression rationnelle accepter les noms d'affichage non valides comme [email protected]#.

Si le code rejette des noms d'affichage valides, cela peut être dû au fait 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).

0

J'ai testé votre script et vous êtes interposé avec 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> 
0

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

0

Une façon plus simple d'écrire, il serait encore

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

Encore plus simple:

var name_regex = /^\w+$/;