2010-01-17 7 views
2

J'ai besoin d'une regex qui vérifie si une chaîne contient seulement des lettres (az) et que la première lettre est en majuscule, vous ne pouvez pas avoir 2 lettres dans un mot majuscule comme: Thomas ou THOMAS Thomas anderson aussi) serait valableBesoin d'aide pour dur regex

regard:

The Magician Of The Elfs serait valide, mais pas ThE MaGiCiAN oF ThE ELFS

if (!preg_match("??", $name)) { 
    echo "Invalid name!"; 
} 

espère que vous comprenez!

Tomasz

non valide:

MaGIciaN Of The ELFz
THomas anderson

valide:

Magician of the elfs
Magician Of the Elfs
Magician of The elfs
Thomas Anderson
Thomas anderson

Fondamentalement, je ne veux pas qu'il soit possible d'avoir plus de 1 lettre majuscule en un mot, pas la peine.

+2

Etes-vous vraiment à la recherche de la gamme 'a-z'? Notez que la classe de caractères '[a-z]' n'a * pas * le 'é' dedans, par exemple. –

+0

Au lieu de rejeter les noms invalides, que diriez-vous de les réparer? Vous pouvez faire $ string = ucwords (strtolower ($ string)); pour que l'entrée invalide s'adapte au style que vous voulez. – JAL

+0

Le caractère espace de l'exemple valide ne se trouve pas dans la plage a-z. – mpez0

Répondre

3

Vous pouvez également décrire le caractère par son Unicode character properties:

/^\p{Lu}\p{Ll}*(?:\s+\p{Lu}\p{Ll}*)*$/ 

Modifier Puisque vous changé vos besoins, essayez cette expression régulière:

/^[\p{Lu}\p{Ll}]\p{Ll}*(?:\s+[\p{Lu}\p{Ll}]\p{Ll}*)*$/ 

Maintenant, la premier caractère ou chaque mot peut être un upperc ase lettre ou une lettre minuscule.

5
'/^[A-Z][a-z]+([A-Z][a-z]+)*$/' 

Non testé, cependant.

EDIT Oh, j'ai peut-être mal interprété votre question. Ce qui précède suppose une longueur de mot minimale de deux. Est-ce que "John A" ou "A Horse" est valide? Dans ce cas: '/^[A-Z][a-z]*([A-Z][a-z]*)*$/'.


Selon les exigences mises à jour:

'/^[A-Z][a-z]*([A-Za-z][a-z]*)*$/' 

une Valide capitalisée lettre suivie d'un certain nombre de lettres minuscules. Après cela, n'importe quel nombre de la séquence: espace, (éventuellement une lettre majuscule), n'importe quel nombre de lettres minuscules (au moins une lettre au total pour chaque espace).

+0

Cela devrait faire l'affaire. Notez que PHP attend des délimiteurs, que j'ai ajoutés. –

+0

Ouais, j'ai oublié (et nous avons eu une petite collision d'édition). Ça devrait être OK maintenant. – jensgram

+0

attends, je voudrais que John horse soit valide aussi – Tomasz

1
$str = "ThE MaGiCiAN oF ThE ELFS"; 
$s = explode(" ",$str); 
foreach ($s as $k){ 
    if (! (preg_match("/^[A-Z][a-z]+/",$k))){ 
     print "$str does not match.\n"; 
     break; 
    } 
} 
+0

+1 pour la simplicité –

0

Wow. \b, les gars.

if matches /\B[A-Z]/ then invalid 

ou, pour être au courant Unicode,

if matches /\B\p{Lu}/ then invalid 

Vous pouvez assurer l'ensemble correspond à la chaîne /^[\p{Lu}\p{Ll}\s]$/ d'abord, pour éviter de laisser des chaînes comme The (Magic) Elf comme valide.

+0

Alors vous proposez de le faire en deux étapes? Dans ce cas, je préfère les solutions de Gumbo et de jensgram (juste une étape assez intuitive). Si vous n'effectuez pas la deuxième validation, non seulement 'The (Magic) Elf' passera, mais aussi des chaînes comme' ???????? 'ou' 11111111122222222' etc. –

+0

Cela dépend si l'entrée déjà est déjà filtré, car l'exemple du demandeur n'inclut pas ces cas. (Et mis à jour pour simplifier encore le test.) – kennytm

+0

En fait, '????????' et '1111111122222222' répond à l'exigence de base" (pas) d'avoir plus de 1 lettre en majuscule dans un mot ". Il n'y a pas de mots ni de majuscules dans la chaîne, donc ça passe. – kennytm

0
if (preg_match("\w[A-Z]", $name)) { 
echo "invalid name!"; 
} 
+0

Non, cela validera positivement '????????' ou '11111111122222222' etc. –