2014-09-28 20 views
10
preg_match(???, 'firstname lastname') // true; 
preg_match(???, '서프 누워') // true; 
preg_match(???, '서프 lastname') // false; 
preg_match(???, '#[email protected] #$$#') // false; 

Attualmente io uso:Corrisponde solo al set di caratteri della stessa lingua (come il nome di Facebook)?

'/^([一-龠0-9\s]+|[ぁ-ゔ0-9\s]+|[ก-๙0-9\s]+|[ァ-ヴー0-9\s]+|[a-zA-Z0-9\s]+|[々〆〤0-9\s]+)$/u' 

ma funziona solo su alcune lingue.

+0

che ne dici di usare \ w \ s + \ w – SolidSnake

+0

Questa è una domanda interessante. Non funziona per alcune delle lingue che definisci nella regex? –

risposta

7

È necessario un'espressione che abbinerà solo caratteri dagli stessi unicode script (e spazi), come:

^([\p{SomeScript} ]+|[\p{SomeOtherScript} ]+|...)$ 

È possibile costruire questa espressione in modo dinamico dalla lista degli script:

$scripts = "Hangul Hiragana Han Latin Cyrillic"; // feel free to add more 

$re = []; 
foreach(explode(' ', $scripts) as $s) 
    $re [] = sprintf('[\p{%s} ]+', $s); 
$re = "~^(" . implode("|", $re) . ")$~u"; 

print preg_match($re, 'firstname lastname'); // 1 
print preg_match($re, '서프 누워'); // 1 
print preg_match($re, '서프 lastname'); // 0 
print preg_match($re, '#[email protected] #$$#'); // 0 

Si noti tuttavia che è comune per i nomi (almeno negli script europei che conosco) includere caratteri come punti, trattini e apostrofi, che appartengono allo script "Comune" piuttosto che a uno specifico della lingua. Per tenerne conto, una versione più realistica di un "pezzo" nella espressione di cui sopra potrebbe essere simile a questo:

((\p{SomeScript}+(\. ?|[ '-]))*\p{SomeScript}+) 

che sarà almeno la convalida correttamente L. A. Léon de Saint-Just.

In generale, la convalida dei nomi delle persone è un problema complesso e non può essere risolta con una precisione del 100%. Vedi this funny post e commenti al riguardo per dettagli ed esempi.

+1

+1, è l'unico approccio che riesco a pensare (senza definire manualmente i set). Ma a volte gli script Unicode sono troppo generici. Prendi in considerazione il latino (http://codepoints.net/search?sc[]=Latn) che ha 1641 codici da cui ogni lingua usa solo un piccolo sottoinsieme di essi. – bwoebi

+1

Inoltre, include i codepoint come (esempio dal latino) 'LETTERA PIENA LARGHEZZA PICCOLA *' che ovviamente non ti piace vedere in un nome ... Ma siccome questo sarà impossibile da controllare, dimentica di controllare più precisamente, il meglio che puoi fare in questo caso è quello che hai fatto - controllando le classi di caratteri. – bwoebi

Problemi correlati