2010-12-01 18 views
5

Aby sprawdzić, czy wprowadzana przez użytkownika angielska nazwa jest poprawna, zwykle dopasowuję dane wejściowe do wyrażenia regularnego, takiego jak [A-Za-z]. Ale jak to zrobić, jeśli obsługa wielu języków (takich jak chiński, japoński itp.) Jest wymagana przy kodowaniu utf8?Weryfikacja wielu języków z kodowaniem UTF-8

+0

Jakiego języka/implementacji wyrażenia regularnego używasz? – Gumbo

+0

Idealnie obsługuje wszystkie języki, czy to możliwe? – Hongbo

+0

Myślę, że Gumbo oznacza "jakiego języka programowania używasz?" –

Odpowiedz

8

Można zbliżenie właściwość pochodzącą Unicode \p{Alphabetic} dość succintly z [\pL\pM\p{Nl}] jeśli język doensn't wspierania prawidłowego Własność Alphabetic bezpośrednio.

Nie używaj języka Java \p{Alpha}, ponieważ that’s ASCII-only.

Ale wtedy zauważysz, że już nie stanowią kresek (\p{Pd} lub DashPunctuation robót, ale to nie robi obejmują większość kresek!), Apostrofy (zazwyczaj, ale nie zawsze jeden z U +27, U + 2BC, U + 2019 lub U + FF07), przecinek lub kropka/kropka.

Prawdopodobnie lepiej było włączyć \p{Pc}ConnectorPunctuation, na wszelki wypadek.

Jeśli posiadasz właściwość pochodną w standardzie Unicode \p{Diacritic}, powinieneś również użyć jej, ponieważ zawiera ona takie elementy, jak środkowa kropka potrzebna do geminacji L w języku katalońskim oraz nie łączące się formy znaków diakrytycznych, których czasami używają ludzie.

Ale wtedy znajdziesz ludzi, którzy korzystają z numerów porządkowych w ich nazw w sposób, który \p{Nl} (LetterNumber) nie pomieści, więc rzucasz \p{Nd} (DecimalNumber) lub nawet wszystkich \pN (Liczba) do miksu.

Wtedy zdajesz sobie sprawę, że nazwy azjatyckich często wymagają użycia ZWJ lub ZWNJ być napisane poprawnie w swoich skryptach, więc wtedy trzeba dodać U + 200D i U + 200C do mieszanki, które są zarówno \p{Cf} (Format) znaków, a nawet JoinControl te.

Kiedy skończysz looking up the various Unicode properties dla różnych egzotycznych i wielu znaków, które pojawiają się utrzymać - lub gdy myślisz skończysz, raczej - jesteś prawie na pewno stwierdzić, że można zrobić wiele lepsza praca w tym przypadku, jeśli po prostu pozwolisz im używać dowolnych znaków Unicode dla swojego imienia, które chcą, jak zaleca the link Tim cites.Tak, dostaniesz kilka żartownisiów w stylu "əɯɐuʇƨɐ⅂ əɯɐuʇƨɹᴉℲ", ale to się zgadza z terytorium i nie można wykluczyć głupich nazw w jakikolwiek rozsądny sposób.

+1

Nie wiem, co mi się bardziej podoba w tej odpowiedzi: fakt, że w rzeczywistości odpowiada na pytanie, że potencjalnie wiele mówi o wyrażeniach regularnych unicode w ogóle, lub o tym, że zwięźle pokazuje, dlaczego próba sprawdzenia prawdziwych nazw jest złym pomysłem. –

3

Zastanów się, czy naprawdę musisz zweryfikować nazwę użytkownika. Może powinieneś pozwolić użytkownikom nazywać siebie, jak tylko chcą.

Z pewnością nie należy używać [A-Za-z], ponieważ niektóre osoby mają nazwy z apostrofami lub myślnikami. To może być dość obraźliwe, aby uniemożliwić komuś użycie prawdziwego nazwiska tylko dlatego, że nie przestrzega twoich arbitralnych reguł, jak powinno wyglądać imię.

0

W PHP Używam tego paskudnego Hack: (. E, I, etc)

setlocale(LC_ALL, 'de_DE'); 
preg_match('/^[[:alpha:]]+$/', $name); 

To obejmuje "Przegłosy" (czyli 'a', 'O' i tym podobne) plus akcentowane samogłoski. Ale daleki do sprawdzania poprawności dla cyrylicy (Rosja, Bułgaria, ...) lub znaków chińskich ...

Powiązane problemy