2011-11-04 13 views
9

Ho sempre lottato con RegEx quindi perdonatemi se questo può sembrare un approccio terribile ad affrontare il mio problema.Accetta caratteri del nome internazionale in RegEx

Quando gli utenti entrano nomi e cognomi Ho cominciato semplicemente utilizzando il base, verificare la presenza di lettere maiuscole e minuscole, lo spazio bianco, apostrofi e trattini

if (!preg_match("/^[a-zA-Z\s'-]+$/", $name)) { // Error } 

Ora mi rendo conto che non è il migliore dal le persone potrebbero avere cose come: Dr. Martin Luther King, Jr. (con virgola e punti fermi). Quindi presumo cambiandolo in questo modo lo renderei leggermente più efficace.

if (!preg_match("/^[a-zA-Z\s,.'-]+$/", $name)) { // Error } 

Poi ho visto un nome di ragazze che conosco sulla mia Facebook che scrive il suo nome come Siân, che mi ha fatto pensare di nomi che contengono dieresi così come dicono i caratteri giapponesi/cinese/coreano/russo troppo. Così ho iniziato a cercare e trovato modi scrivendo ognuno di questi personaggi lì dentro così.

if (!preg_match("/^[a-zA-Z\sàáâäãåèéêëìíîïòóôöõøùúûüÿýñçčšžÀÁÂÄÃÅÈÉÊËÌÍÎÏÒÓÔÖÕØÙÚÛÜŸÝÑßÇŒÆČŠŽ∂ð ,.'-]+$/u", $first_name)) { // Error } 

Come si può immaginare, è estremamente prolisso e sono abbastanza certo c'è una RegEx molto più semplice che può raggiungere questo obiettivo. Come ho detto, ho cercato in giro ma questo è il meglio che posso fare.

Quindi, qual è un buon modo per verificare la presenza di caratteri maiuscoli e minuscoli, virgole, punti fermi, apostrofi, hypens, dieresi, latino, giapponese/Russo ecc

+0

Ciò NON FUNZIONERÀ a meno che non si normalizzi prima, e spesso nemmeno in quel momento. – tchrist

risposta

28

È possibile utilizzare una classe di caratteri Unicode. \pL copre praticamente tutti i simboli delle lettere.
http://php.net/manual/en/regexp.reference.unicode.php

if (!preg_match("/^[a-zA-Z\s,.'-\pL]+$/u", $name)) 

Vedi anche http://www.regular-expressions.info/unicode.html, ma attenzione che PHP/PCRE capisce solo i nomi delle classi abbreviati.

+0

+1 Picchiami al punto :) – FailedDev

+0

Ah grazie mille, perché non ho potuto trovarlo prima, ah! Potresti dirmi cosa intendi con nomi di classi abbreviati? – Joe

+0

@HelloJoe: Non è la caratteristica più ovvia. Ha trovato abbastanza tardi la documentazione nel manuale PHP. Abbreviazioni: PCRE supporta solo '\ p {L}' non '\ p {Letter}' o '\ p {Russian}' per esempio. – mario

2

Ci potrebbe probabilmente essere qualche allentamento delle qualifiche, consentendo ad altri tipi di punteggiatura.

Una cosa che dovrebbe essere una restrizione richiede almeno una lettera.
regex di modifica mario un bit:

if (!preg_match("/^(?:[\s,.'-]*[a-zA-Z\pL][\s,.'-]*)+$/u", $name))

7

\pL include già a-z e A-Z, quindi il modello citato "/^[a-zA-Z\s,.'-\pL]+$/u" potrebbe essere semplificata per

"/^[\s,.'-\pL]+$/"

anche il modificatore u non è necessaria.

+4

Anche se inizialmente intendevo fare +1 per la menzione del fatto che 'a-zA-Z' è ridondante, devo dire che il modificatore' u' è certamente richiesto altrimenti PHP non supporta codifiche multibyte. – dotancohen

+0

L'ho provato sul mio dispositivo DEV e ha funzionato per me evento senza il modificatore 'u' – staabm

+0

Stavi usando una codifica UTF-8 o altra codifica multibyte o una codifica a singolo byte come ASCII o latin1? Il modificatore 'u' non è necessario per le codifiche a byte singolo. – dotancohen