Ho cercato, cercato, giocato e giocato con esso e sebbene non sia perfetto può aiutare gli altri a tentare di convalidare il nome e il cognome forniti come una variabile.
Nel mio caso, quella variabile è $ name.
Ho usato il seguente codice per il mio PHP:
if (preg_match('/\b([A-Z]{1}[a-z]{1,30}[- ]{0,1}|[A-Z]{1}[- \']{1}[A-Z]{0,1}
[a-z]{1,30}[- ]{0,1}|[a-z]{1,2}[ -\']{1}[A-Z]{1}[a-z]{1,30}){2,5}/', $name)
# there is no space line break between in the above "if statement", any that
# you notice or perceive are only there for formatting purposes.
#
# pass - successful match - do something
} else {
# fail - unsuccessful match - do something
Sto imparando RegEx da solo, ma ho la spiegazione del codice fornita dall'amico RegEx.
Ecco qui:
Asserisci la posizione al confine di una parola «\ b»
Trova la corrispondenza con l'espressione regolare di seguito e acquisisci la sua corrispondenza nel backreference numero 1
«([AZ] {1} [az] {1,30} [-] {0,1} | [AZ] {1} [- \ '] { 1} [AZ] {0,1} [az] {1,30} [-] {0,1} | [az] {1,2} [- \ '] {1} [AZ] {1} [ az] {1,30}) {2,5} »
Da 2 a 5 volte, quante più volte possibile, restituendo se necessario (avido) «{2,5}»
* HO BISOGNO DI AIUTO QUI PER COMPRENDERE LE RAMIFICHE DI QUESTA NOTA *
Nota: ho ripetuto il gruppo di acquisizione stesso. Il gruppo acquisirà solo l'ultima iterazione. Metti un gruppo di acquisizione attorno al gruppo ripetuto per acquisire tutte le iterazioni. «{2,5}»
Trova la corrispondenza con l'espressione regolare sotto (tentando la successiva alternativa solo se questa fallisce) «[AZ] {1} [az] {1,30} [-] {0,1}»
Trova un singolo carattere nell'intervallo tra "A" e "Z" «[AZ] {1}»
Esattamente 1 volta «{1}»
Trova un singolo carattere nell'intervallo tra "a" e "z" «[az] {1,30}»
Da una a 30 volte, quante più volte possibile, restituendo se necessario (avido) «{1,30}»
Trova la corrispondenza di un singolo carattere presente nell'elenco "-" «[-] {0,1}»
Da zero a una volta, quante più volte possibile, restituendo se necessario (avido) «{0,1}»
Oppure trova l'espressione regolare numero 2 di seguito (tentando l'alternativa successiva solo se questa fallisce) «[AZ] {1} [- \ '] {1} [AZ] {0,1} [az] {1,30} [ -] {0,1} »
Trova un singolo carattere nell'intervallo tra "A" e "Z" «[AZ] {1}»
Esattamente 1 volta «{1}»
Trova un singolo carattere presente nell'elenco sotto «[- \ '] {1}»
Esattamente 1 volta «{1}»
Uno dei caratteri "-" «-» A 'carattere «\'»
Trova un singolo carattere nell'intervallo tra "A" e "Z" «[AZ] {0,1}»
Da zero a una volta, quante più volte possibile, restituendo se necessario (avido) «{0,1}»
Trova un singolo carattere nell'intervallo tra "a" e "z" «[az] {1,30}»
Da una a 30 volte, quante più volte possibile, restituendo se necessario (avido) «{1,30}»
Trova la corrispondenza di un singolo carattere presente nell'elenco "-" «[-] {0,1}»
Da zero a una volta, quante più volte possibile, restituendo se necessario (avido) «{0,1}»
Oppure trova l'espressione regolare numero 3 di seguito (l'intero gruppo fallisce se questa non riesce a trovare la corrispondenza) «[az] {1,2} [- \ '] {1} [AZ] {1} [az] {1,30} »
Trova un singolo carattere nell'intervallo tra "a" e "z" «[az] {1,2}»
Da una a 2 volte, quante più volte possibile, restituendo se necessario (avido) «{1,2}»
Trova un singolo carattere nell'intervallo tra "" e "'" «[- \'] {1}»
Esattamente 1 volta «{1}»
Trova un singolo carattere nell'intervallo tra "A" e "Z" «[AZ] {1}»
Esattamente 1 volta «{1}»
Trova un singolo carattere nell'intervallo tra "a" e "z" «[az] {1,30}»
Da una a 30 volte, quante più volte possibile, restituendo se necessario (avido) «{1,30}»
So che questa convalida presume totalmente che ogni persona che compila il modulo abbia un nome occidentale e questo potrebbe eliminare la stragrande maggioranza delle persone nel mondo. Tuttavia, credo che questo sia un passo nella giusta direzione. Forse questa espressione regolare è troppo semplice perché i guru possano affrontarla in modo semplicistico o forse c'è qualche altro motivo per cui non sono riuscito a trovare il codice sopra nelle mie ricerche. Ho passato troppo tempo a cercare di capire questo pezzo, probabilmente noterai quanto sia annebbiata la mia mente su tutto questo se guardi i nomi dei miei test di seguito.
Ho testato il codice sui seguenti nomi ei risultati sono tra parentesi a destra di ogni nome.
- STEVE SMITH (fallire)
- Stev3 Smith (fallire)
- STeve Smith (fallire)
- Steve SMith (fallire)
- Steve Sm1th (passato allo Steve Sm)
- d'Are a Beaware (passato sull'Are a Beaware)
- Jo Blow (superato)
- Hyoung Kyoung Wu (superato)
- Mike O'Neal (superato)
- Steve Johnson-Smith (superato)
- Jozef-Schmozev Hiemdel (superato)
- O Henry Smith (superato)
- Mathais d'Arras (superato)
- Martin Luther King Jr (superato)
- Downtown-James Brown (superato)
- Darren McCarty (superato)
- George De FunkMaster (superato)
- Kurtis B-Ball Basketball (superato)
- Ahmad el Jeffe (superato)
Se hai nomi di base, devono esserci più di uno fino a cinque affinché il codice sopra funzioni, che sono simili a quelli che ho usato durante il test, questo codice potrebbe essere per te.
In caso di miglioramenti, fatemelo sapere. Sono solo nelle prime fasi (i primi mesi per capire RegEx.
Grazie e buona fortuna, Steve