2010-08-07 4 views
1

J'ai une zone de texte d'entrée qui exécute une fonction js sur l'événement keyup pour correspondre à une chaîne valide (correspondance de modèle de nom de domaine, la regex a été trouvée ici).Comment configurer cette fonction de correspondance de regex javascript?

J'ai écrit les instructions if pour tester si l'entrée est un motif valide d'abord, puis plus de 3 caractères.

Apparemment, mes ifs ne fonctionnent pas comme je le voulais. Lorsque l'entrée a 3 caractères ou plus, c'est bien. Mais si l'entrée est inférieure à 3 caractères, l'expression rationnelle du motif échoue. Exemple: si la boîte de saisie a "dd" (sans guillemets), la fonction alertera que j'ai un motif incorrect quand il DEVRAIT avertir que l'entrée a moins de 3 caractères. A partir de l'instruction d'alerte incluse, il n'y a pas d'espaces ou de caractères supplémentaires dans la valeur d'entrée.

<input id="quick" type="text" size="20" onKeyUp="test()"></input> 

le test de fonctionnement est

function test(){ 

    var liveword = document.getElementById("quick").value; 
    var valid = /^[a-zA-Z0-9][a-zA-Z0-9\-\_]+[a-zA-Z0-9]$/; 
    alert("xxx"+liveword+"xxx"); 

    if (liveword.match(valid)) 
    { 
     if (liveword.length < 3) 
     { 
     alert ('word less than 3'); 
     } 
     else { 
    alert ('word more than 3'); 
      } 
    }//outside if 

    else { 
     alert('enter correct pattern'); 

    } 

} //close 

Répondre

2

Comme votre modèle est actuellement écrit, rien de moins de 3 lettres ne peut jamais égaler. Votre regex dit "Trouver tout alphanumérique, suivi d'au moins un alphanumérique ou un tiret ou un trait de soulignement, suivi d'un alphanumérique final."

Je pense que vous voudrez peut-être un couplage optionnel à la place. Avec:

var valid = /^[a-zA-Z0-9][a-zA-Z0-9\-\_]*[a-zA-Z0-9]?$/; 

Vous pouvez faire correspondre n'importe quel caractère alphanumérique, même s'il n'y a qu'un seul caractère. Vraiment bien, ce qui précède est la même chose que de dire simplement:

var valid = /^[a-zA-Z0-9][a-zA-Z0-9\-\_]*$/; 

Notez que les deux seraient toujours concilié sur quelque chose comme a-. Si ce n'est pas une correspondance prévue (ce que vous voulez exiger un alphanumérique de terminaison quand tiret ou un tiret sont utilisés), puis aller avec:

var valid = /^[a-zA-Z0-9]([a-zA-Z0-9\-\_]*[a-zA-Z0-9])?$/; 

qui dit « Trouver un alphanumérique.S'il y a des caractères qui le suivent, il peut être suivi par zéro ou plusieurs caractères alphanumériques, traits d'union ou traits de soulignement, tant que le dernier caractère est alphanumérique. "

+0

Salut JGB, merci pour le code regex. J'ai reçu le code d'un autre message et il a semblé fonctionner de façon indépendante au début, mais je suppose que cela ne fonctionne pas en conjonction avec les instructions if que j'ai incluses. Regex est l'un de ces types de choses que vous comprenez ou non, et je ne le comprends pas. – jamex

+0

@jamex: De rien. Regex jette beaucoup de monde, donc vous êtes en bonne compagnie. Étiez-vous capable d'obtenir l'effet que vous vouliez avec l'un des motifs regex que j'ai fournis? –

+0

merci, je viens de le tester (votre deuxième regex), et ça fonctionne parfaitement. Merci encore. – jamex

1

Votre premier si teste pour voir si le motif est correspondant, quelle que soit la longueur. Si c'est un bon match, alors vous vérifiez la longueur. Sinon, vous alertez "entrer le modèle correct".

Vous voulez faire:

if(liveword.length < 3) 
    alert('too short') 

else 
{ 
    // check patterns, alert good or bad 
} 

Modifier

Votre code, refondus:

function test(){ 

    var liveword = document.getElementById("quick").value; 
    var valid = /^[a-zA-Z0-9][a-zA-Z0-9\-\_]+[a-zA-Z0-9]$/; 
    alert("xxx"+liveword+"xxx"); 

    if(liveword.length < 3) 
     alert('word less than 3'); 

    else 
    { 
     if(liveword.match(valid)) 
      alert('good match') 

     else 
      alert('bad match') 
    } 

} //close 
+0

Salut, merci, votre code fonctionne, mais je voulais intentionnellement – jamex

+0

@Jamex: Pourquoi? La vérification de la longueur est certainement une opération plus rapide que la vérification de la validité –

+0

Je ne veux pas que le code vérifie la longueur si l'entrée est invalide. @JGB, si l'utilisateur entre "#" ou., En tant que premier caractère, vous ne voulez pas attendre que l'utilisateur entre le caractère suivant avant de donner un avertissement, de cette façon, l'utilisateur n'a pas à frapper un – jamex

0

Si le if (liveword.match(valid)) réussit alors cela signifie que le mot est au moins trois caractères longs depuis votre expression régulière nécessite au moins trois caractères. Le chèque if (liveword.length < 3) ne réussira donc jamais où il se trouve. Vous devez déplacer à une clause else afin de vérifier la longueur si le mot ne match:

if (liveword.match(valid)) { 
    alert ('word 3 or more'); 
} 
else if (liveword.length < 3) { 
    alert ('word less than 3'); 
} 
else { 
    alert('enter correct pattern'); 
} 
+0

Salut John, je ne pense pas que le r Le modèle egex contient la vérification de la longueur. C'est l'instruction "if" qui vérifie la longueur. – jamex

+0

@ John, désolé, je manque de connaissances regex m'a conduit à mal compris votre réponse. – jamex

Questions connexes