2010-12-01 13 views
5

Per verificare che un nome inglese di input dell'utente sia valido, di solito corrispondere l'input all'espressione regolare, ad esempio [A-Za-z]. Ma come posso farlo se è richiesto il supporto multilingua (come il cinese, il giapponese, ecc.) Con la codifica utf8?Convalida dell'ingresso multilingue con codifica UTF-8

+0

Quale implementazione di linguaggio/espressione regolare utilizzate? – Gumbo

+0

Supporta idealmente tutte le lingue, è possibile? – Hongbo

+0

Penso che Gumbo significhi "quale linguaggio di programmazione stai usando?" –

risposta

8

È possibile approssimare la proprietà Unicode derivata \p{Alphabetic} piuttosto succintamente con [\pL\pM\p{Nl}] se la lingua doensn't supporta una corretta Alfabetico proprietà direttamente.

Non utilizzare Java \p{Alpha}, perché that’s ASCII-only.

Ma poi si noterà che hai fallito per tenere conto di trattini (\p{Pd} o DashPunctuation opere, ma ciò non comprendono la maggior parte dei trattini!), Apostrofi (di solito ma non sempre una delle U +27, U + 2BC, U + 2019 o U + FF07), virgola o punto/punto completo.

Probabilmente è meglio includere \p{Pc}ConnectorPunctuation, per ogni evenienza.

Se si dispone della proprietà derivata Unicode \p{Diacritic}, è consigliabile utilizzarla anche perché include elementi come il punto centrale necessario per L'gemello in catalano e le forme non combinabili di segni diacritici che le persone talvolta utilizzano.

Ma allora troverete persone che usano i numeri ordinali nei loro nomi in modi che \p{Nl} (LetterNumber) non significa accogliere, in modo da gettare \p{Nd} (DecimalNumber) o anche tutti \pN (Numero) nel mix.

poi ti rendi conto che i nomi asiatici spesso richiedono l'uso di ZWJ o zwnj da scrivere in modo corretto nei loro script, così poi si deve aggiungere U + 200D e U + 200C al mix, che sono entrambi \p{Cf} (Format) caratteri e infatti anche JoinControl uni.

Con il tempo il gioco è fatto looking up the various Unicode properties per i vari e tanti personaggi esotici che mantengono a saltar fuori - o quando si pensa il gioco è fatto, invece - si è quasi certo di concludere che si farebbe un gran un lavoro migliore in questo caso se si consente semplicemente loro di utilizzare qualsiasi carattere Unicode per il loro nome che desiderano, come consiglia the link Tim cites.Sì, avrai alcuni jolly che metteranno cose come "əɯɐuʇƨɐ⅂ əɯɐuʇƨɹᴉℲ", ma questo va solo con il territorio, e non puoi escludere nomi sciocchi in alcun modo ragionevole.

+1

Non so cosa mi piace di più di questa risposta in più: il fatto che in realtà risponda alla domanda, il fatto che potenzialmente insegni molto sulle espressioni regolari unicode in generale, o sul fatto che dimostra succintamente perché provare a convalidare i nomi reali è una cattiva idea. –

3

Pensa se è davvero necessario convalidare il nome dell'utente. Forse dovresti permettere agli utenti di chiamarsi come vogliono.

Non si dovrebbe mai usare [A-Za-z], perché alcune persone hanno nomi con apostrofi o trattini. Può essere piuttosto offensivo impedire a qualcuno di usare il loro vero nome solo perché non segue le regole arbitrarie per come dovrebbe apparire un nome.

0

In PHP Io uso questo brutto trucco: (. E, I, ecc)

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

che include "dieresi" (vale a dire 'a', 'O' e simili) più le vocali accentate. Ma a corto di convalidare per cirillico (Russia, Bulgaria, ...) o caratteri cinesi ...