2010-06-19 3 views

Répondre

11

let result = /^[a-zA-Z ]+$/.test('John Doe'); 
 
console.log(result);

Jetez tous les symboles dont vous avez besoin dans la classe de caractères. C'est pourquoi j'ai dit être spécifique environ exactement ce que vous voulez valider. Cette regex ne tiendra pas compte des caractères accentués, si vous tenez à ce que vous feriez mieux d'aller avec la correspondance unicode.

+0

et puis-je le faire avec javascript? Ou devra-t-il être fait côté serveur? – yoda

+0

Cela peut être fait avec JS ou côté serveur. –

+0

quelqu'un peut-il donner un exemple? – yoda

0

il suffit d'ajouter un espace

^[\w ]+$ 

ne sais pas si c'est votre besoin.

5

FWIW, je l'ai écrit ce regex pour le nettoyage des noms:

let name = "John Doe"; 
 
let result = name.replace(/[^A-Za-z0-9_'-]/gi, ''); 
 
console.log(result);

Cela vous permettra de noms comme O'Brien, Smith, Smith-O'Brian passent à travers, mais empêchera "noms" comme Engle, drop utilisateur; d'être passé à travers. Quoi qu'il en soit, c'est quatre ans après le fait, mais j'espère que ma réponse sera utile.

+0

Merci, il sera utile :) – yoda

4

Essayez ceci:

/^(([A-Za-z]+[\-\']?)*([A-Za-z]+)?\s)+([A-Za-z]+[\-\']?)*([A-Za-z]+)?$/ 

Il attend en option [au moins 1 caractère alphabétique suivi d'un 'ou -] un nombre indéfini de fois. Il doit y avoir au moins un caractère alphabétique devant un espace requis pour s'assurer que nous obtenons au moins le prénom et le nom. Tout ce schéma est groupé pour accepter une répétition indéfinie (pour les personnes qui aiment utiliser tous leurs noms, comme John Jacob Jingleheimer Schmidt), mais doit apparaître au moins une fois, au moyen du signe + au milieu. Enfin, le nom de famille est traité de la même manière que les autres noms, mais aucun espace de fin n'est autorisé. (Malheureusement, cela signifie que nous enfreignons SECHE un peu.)

Voici le résultat sur plusieurs pièces possibles de l'entrée:

"Jon Doe": true 
"Jonathan Taylor Thomas": true 
"Julia Louis-Dreyfus": true 
"Jean-Paul Sartre": true 
"Pat O'Brien": true 
"Þór Eldon": false 
"Marcus Wells-O'Shaugnessy": true 
"Stephen Wells-O'Shaugnessy Marcus": true 
"This-Is-A-Crazy-Name Jones": true 
"---- --------": false 
"'''' ''''''''": false 
"'-'- -'-'-'-'": false 
"a-'- b'-'-'-'": false 
"'-'c -'-'-'-d": false 
"e-'f g'-'-'-h": false 
"'ij- -klmnop'": false 

Notez qu'il ne gère pas encore les caractères Unicode, mais il pourrait peut-être élargi pour inclure ceux si nécessaire.

+0

ne fonctionne pas avec les trémas –

+0

ne fonctionne pas avec un seul nom ... –

+0

Les gens, tous les cas de test sont énumérés ci-dessus. Si vous trouvez que cela ne fonctionne pas avec quelque chose, alors faites-le vous-même et soumettez-le comme une réponse. Faites partie de la solution, pas du précipité. ;) –

1
^\s*([A-Za-z]{1,}([\.,] |[-']|))+[A-Za-z]+\.?\s*$ 

Similaire à la solution de @ Stephen_Wylie, mais plus courte (mieux?).

+0

Bonne réponse! Je vous remercie! Je pense que votre regex est la seule qui ** correspond à tout ** de ce qui suit: "Kiersten F. Latham", "Pat O'Brien", "Marcus Wells-O'Shaugnessy", "Stephen Wells-O'Shaugnessy" Marcus "," Ceci est-un-fou-nom Jones "' – Casper

+0

** Note: ** Si vous avez besoin de faire correspondre les noms d'un seul mot, ajoutez juste un '?' Après '([.,] | [- ' ] |) ', ou quittez'? 'et ajoutez' | \ w + 'à la fin de l'expression entière. – Casper