Pour vérifier que l'entrée d'un nom d'utilisateur anglais est valide, l'entrée correspond généralement à une expression régulière telle que [A-Za-z]. Mais comment puis-je le faire si un support multilingue (comme le chinois, le japonais, etc.) est requis avec l'encodage utf8?Validation d'entrée multilingue avec codage UTF-8
Répondre
Vous pouvez approcher la propriété dérivée Unicode \p{Alphabetic}
assez succintement avec [\pL\pM\p{Nl}]
si votre langue doensn't soutenir un bon Alphabétique propriété directement. N'utilisez pas le \p{Alpha}
de Java, car that’s ASCII-only.
Mais vous remarquerez que vous avez omis de tenir compte des tirets (\p{Pd}
ou DashPunctuation œuvres, mais qui ne pas comprennent la plupart des traits d'union!), Apostrophes (généralement, mais pas toujours l'un des U +27, U + 2BC, U + 2019 ou U + FF07), virgule, ou point/période.
Vous devriez probablement inclure \p{Pc}
ConnectorPunctuation, juste au cas où. Si vous possédez la propriété dérivée Unicode \p{Diacritic}
, vous devez l'utiliser également car elle contient des éléments comme le point milieu nécessaire pour les L géminés en catalan et les formes non combinées de marques diacritiques que les gens utilisent parfois.
Mais vous trouverez des gens qui utilisent les nombres ordinaux dans leurs noms de façon à \p{Nl}
(LetterNumber) n'ACCUEILLIR pas, donc vous jetez \p{Nd}
(DecimalNumber) ou même tous \pN
(Nombre) dans le mélange.
Ensuite, vous vous rendez compte que les noms asiatiques nécessitent souvent l'utilisation de ZWJ ou ZWNJ être correctement écrit dans leurs scripts, alors vous devez ajouter U + 200D et U + 200C au mélange, qui sont tous deux \p{Cf}
(Format) caractères et en effet également JoinControl ones.
Au moment où vous avez terminé looking up the various Unicode properties pour les différents et de nombreux personnages exotiques qui maintiennent surgissent - ou quand vous pensez que vous avez terminé, plutôt - vous êtes presque certain de conclure que vous feriez beaucoup meilleur travail à ceci si vous les avez simplement permis d'employer n'importe quels caractères d'Unicode pour leur nom qu'ils souhaitent, comme le conseille the link Tim cites.Oui, vous aurez quelques jokers qui mettent des choses comme "əɯɐuʇƨɐ⅂ əɯɐuʇƨɹᴉℲ", mais cela va avec le territoire, et vous ne pouvez pas exclure des noms idiots d'une manière raisonnable.
Je ne sais pas ce que j'aime le plus à propos de cette réponse plus: le fait qu'elle répond réellement à la question, le fait qu'elle en apprenne beaucoup sur les expressions régulières Unicode en général, ou le fait que il démontre succinctement pourquoi essayer de valider de vrais noms est une mauvaise idée. –
Déterminez si vous devez vraiment valider le nom de l'utilisateur. Peut-être que vous devriez laisser les utilisateurs s'appeler eux-mêmes ce qu'ils veulent.
Vous ne devriez certainement jamais utiliser [A-Za-z]
, car certaines personnes ont des noms avec des apostrophes ou des traits d'union. Il peut être assez insultant d'empêcher quelqu'un d'utiliser son vrai nom juste parce qu'il ne suit pas vos règles arbitraires quant à ce à quoi un nom devrait ressembler.
En PHP J'utilise ce méchant bidouille: (. È, í, etc.)
setlocale(LC_ALL, 'de_DE');
preg_match('/^[[:alpha:]]+$/', $name);
qui inclut "trémas" (à savoir 'a', 'ö' et similaires) ainsi que les voyelles accentuées. Mais il est loin de valider cyrillique (Russie, Bulgarie, ...) ou les caractères chinois ...
Quelle implémentation de langue/expression régulière utilisez-vous? – Gumbo
Idéalement, soutenir toutes les langues, est-ce possible? – Hongbo
Je pense que Gumbo signifie "quel langage de programmation utilisez-vous?" –