2009-06-08 8 views
1

Merci à la réponse de S. Gehrig dans le initial question J'ai une regex qui fonctionne bien et valide une variable basée sur la propriété Letter (sauf chinois, mais c'est un autre sujet :) :OR opérateur en PHP regex (y compris la validation Unicode)

if (preg_match('/^\p{L}+$/u', $input)) { 
    // OK 
} 

Malheureusement je ne peux pas l'étendre à l'appui à l'appui des numéros respectifs question/exclamation & co. Mes expériences comprenaient:

'/^[\p{L}]|[0-9]|[\n]|[']|[\?]|[\!]|[\.]|[\,]+$/u' 
'/^[\p{L}+]|[0-9]|[\n]|[']|[\?]|[\!]|[\.]|[\,]$/u' 
'/^[\p{L}+]|[0-9]|[\n]|[']|[\?]|[\!]|[\.]|[\,]$/u' 

Quelle est la regex correcte? S'il te plait, oriente moi dans la bonne direction.

Beaucoup, merci beaucoup!

+0

Qu'essayez-vous de faire avec cette regex? Le titre n'a aucun sens. –

+0

Mis à jour, j'espère que cela a plus de sens maintenant – MrG

Répondre

1

\p{L}+ est déjà "chaîne non vide de \p{L}". [] d'autre part indiquer « l'un des », donc selon vos besoins réels, soit cela devrait fonctionner:

Tout (positif, non nul) nombre de caractères spécifiés dans l'ordre:

/^[\p{L}0-9\n'?!.,]+$/u 

soit une séquence de \p{L} s ou une séquence de mélange [0-9\n'?!.,]:

/^(\p{L}+|[0-9\n'?!.,]+)$/u 

soit une séquence de \p{L} s ou exactement une des [0-9\n'?!.,]:

/^(\p{L}+|[0-9\n'?!.,])$/u 
+0

Vous pouvez placer le \ p {L} dans la classe de caractères avec les caractères littéraux. –

+0

merci pour l'indice. Je ne suis pas particulièrement ferme avec les regex de php. –

+0

Attention! Vos deux expressions régulières ne sont PAS équivalentes. '/^foo | bar $ /' est égal à '/ (?:^foo) | (?: bar $) /' et '/ (?:^foo | bar $) /' mais pas égal à '/^(?: foo | bar) $/'! – Gumbo