2010-02-28 6 views
6

j'ai une expression régulière simple pour vérifier un nom d'utilisateur:Matching UTF Caractères avec preg_match en PHP: (* UTF8) Fonctionne sous Windows mais pas Linux

preg_match('/(*UTF8)^[[:alnum:]]([[:alnum:]]|[ _.-])+$/i', $username); 

Dans les tests locaux (Windows 7 en utilisant WAMP), cette permettra les noms d'utilisateur en utilisant des caractères UTF (tels que é ou ñ). Cependant, quand je me déplace pour tester cela sur le serveur où le site sera effectivement hébergé, je reçois l'avertissement suivant:

Attention: preg_match() [function.preg match]: Compilation a échoué: (* VERB) non reconnu à l'offset 5 dans /home/sites/vgmusic.com/test/Core/Impl/FormElementValidator.php en ligne 12

J'ai aussi essayé sur une installation locale Ubuntu et obtenir la même erreur. En fait, j'ai seulement vu ce travail sur mon environnement de développement local. Y at-il un moyen d'autoriser les caractères spéciaux qui fonctionneront pour tous les systèmes d'exploitation?

+0

Que pensez-vous que '(* UTF8)' fait? – Gumbo

+0

Eh bien, avant de l'ajouter, ce qui précède retournerait faux quand un caractère tel que é a été entré. Après l'avoir ajouté, ces caractères ont été acceptés et le résultat ci-dessus est vrai. Je m'attendais à ce qu'il permette ces personnages. – Scott

+0

C'est presque certainement vers les versions de PHP. Quelles versions de PHP exécutez-vous? Est-ce que les pages phpinfo() contiennent des informations sur les versions de PCRE? –

Répondre

14

Essayez en décrivant les personnages par son Unicode character properties:

preg_match('/^\p{L}[\p{L} _.-]+$/u', $username) 
+1

Ça a l'air bien. Je crois que ce qui suit permettra également des nombres comme l'exemple original avait: 'preg_match ('/^(\ p {L} | \ p {N}) [(\ p {L} | \ p {N}) _ .-] + $/u ', $ nom d'utilisateur) ' – Scott

+0

@S. DePouw, faites que ''/^ [\ p {L} \ p {N}] [\ p {L} \ p {N} _.-] + $/u''. Dans une classe de caractères, '(', ')' et '|' correspondent simplement '(', ')' et '|'. –

2

j'avais déjà essayé avec le paramètre /u mentionné. Sur Windows (PHP 5.2.16), l'ajout du paramètre /u a bien fonctionné pour capturer une chaîne contenant des caractères Unicode, mais sur CentOS 5 et PHP 5.2.16, je ne pouvais toujours pas capturer une chaîne contenant des caractères Unicode, en utilisant .* (preg_match fondamentalement échoué à Capturer).

Après un long moment à ne rien faire, avec les paramètres 'LOCALE' qui n'ont rien changé, j'ai finalement trouvé this site.

J'ai fait un rpm -Uvh de la version appropriée rpm fourni, redémarré apache, et soudainement mes regexes ont bien fonctionné!

Même si j'avais initialement le support UTF-8, mes regex ne capturaient pas de chaînes Unicode avant d'avoir installé le RPM mis à jour, qui ajoute également le "support des propriétés Unicode". Je pensais qu'avoir un support UTF-8 aurait été suffisant, mais apparemment pas.

1

il semble que ce soit un vieux post mais comme c'est toujours un sujet d'intérêt je vais poster ce que j'ai découvert here. C'est une petite différence mais cela rend le code plus simple. La chose est que accolades sont facultatifs.

Le code ci-dessus Gumbo et Scott peut être écrit plus simple comme cela, si quelqu'un veut autoriser uniquement les lettres (Unicode & non-Unicode) et des espaces vides:

preg_match("/^\pL[\pL ]+$/u",$string) 

J'ai aussi remarqué que preg_match accepte même code plus simple comme suit:

preg_match("/^[\pL ]+$/u",$string) 
Questions connexes