Question

J'essaie d'écrire un validateur raisonnablement permissif pour les noms en PHP, et ma première tentative consiste en le modèle suivant:

// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";

Ceci est finalement transmis à un appel à preg_match(). Pour autant que je sache, cela fonctionne avec votre alphabet Vanilla ASCII, mais semble trébucher sur des personnages plus épicés comme ă ou 张.

Y a-t-il quelque chose qui ne va pas avec le modèle lui-même? Peut-être que j'attends \p{L} Pour faire plus de travail que je ne le pense?

Ou cela a-t-il quelque chose à voir avec la façon dont les contributions sont transmises? Je ne sais pas si c'est pertinent, mais je me suis assuré de spécifier un encodage UTF8 sur la page du formulaire.

Était-ce utile?

La solution

Je pense que le problème est beaucoup plus simple que cela: vous avez oublié de spécifier le u modificateur. Les propriétés de caractères Unicode sont uniquement disponible en mode UTF-8.

Votre regex devrait être:

// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';

Autres conseils

Si vous souhaitez remplacer Unicode old pattern avec new pattern vous devriez écrire:

$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);

Donc la clé ici est u modificateur

Noter : Votre serveur php version shoud au moins PHP 4.3.5

Comme mentionné ici php.net | Modificateurs de motif

u (pcre_utf8) Ce modificateur excite les fonctionnalités supplémentaires de PCRE incompatibles avec Perl. Les chaînes de motifs sont traitées comme UTF-8. Ce modificateur est disponible à partir de PHP 4.1.0 ou plus sur UNIX et à partir de PHP 4.2.3 sur Win32. La validité UTF-8 du motif est vérifiée depuis PHP 4.3.5.

Merci AgreeOrNot qui me donne cette clé ici preg_replace correspond à un mot entier en arabe

Je l'ai essayé et cela a fonctionné dans LocalHost mais quand je l'essaye dans le serveur distant, cela n'a pas fonctionné, puis j'ai trouvé que PHP.NET Start utilise u Modificateur dans PHP 4.3.5. , Je mets à niveau la version PHP et ça marche

Il est important de savoir que cette méthode est très utile pour les utilisateurs arabes (عربي) car - comme je le crois - Unicode est le meilleur encodage pour la langue arabe, et le remplacement ne fonctionnera pas si vous n'utilisez pas le u modificateur, voir l'exemple suivant, cela devrait fonctionner avec vous

$text = preg_replace('/\bمرحبا بك\b/u', 'NEW', $text);

Tout d'abord, votre vie serait beaucoup plus facile si vous utilisez des apostrophes uniques au lieu de doubles citations lorsque vous les écrivez - vous n'avez besoin que d'une seule barre de barre arrière. Deuxièmement, combinant des marques \pM devrait également être inclus. Si vous trouvez un personnage non apparié, veuillez découvrir son point de code Unicode et que vous pouvez utiliser http://www.fileformat.info/info/unicode/ pour déterminer où il se trouve. j'ai trouvé http://hsivonen.iki.fi/php-utf8/ Un outil inestimable lorsque vous faites du débogage avec les propriétés UTF-8 (n'oubliez pas de vous convertir en hexadécimal avant d'essayer de rechercher: array_map('dechex', utf8ToUnicode($text))).

Par exemple, il s'avère être http://www.fileformat.info/info/unicode/char/0102/index.htm Et pour être à Lu et donc je devrait le faire correspondre et cela correspond à moi. L'autre personnage est http://www.fileformat.info/info/unicode/char/5f20/index.htm et est aussi Isletter et fait des matchs pour moi. Avez-vous les tables de caractères Unicode compilées?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top