He buscado y buscado y jugado y jugado con él y, aunque no es perfecto, puede ayudar a otros a intentar validar los nombres y apellidos que se han proporcionado como una variable.
En mi caso, esa variable es $ name.
Usé el siguiente código para mi 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
Estoy aprendiendo RegEx yo mismo, pero tengo la explicación del código proporcionada por RegEx buddy.
Aquí está:
Afirmar la posición en el límite de una palabra «\ b»
Haga coincidir la expresión regular a continuación y capture su coincidencia en el número de referencia inversa 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} »
Entre 2 y 5 veces, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{2,5}»
* NECESITO AYUDA AQUÍ PARA ENTENDER LAS RAMIFICACIONES DE ESTA NOTA *
Nota: repetí el grupo de captura en sí. El grupo capturará solo la última iteración. Coloque un grupo de captura alrededor del grupo repetido para capturar todas las iteraciones. «{2,5}»
Coincide con la expresión regular de abajo (intentando la siguiente alternativa solo si esta falla) «[AZ] {1} [az] {1,30} [-] {0,1}»
Coincide con un solo carácter en el rango entre "A" y "Z" «[AZ] {1}»
Exactamente 1 vez «{1}»
Coincide con un solo carácter en el rango entre "a" y "z" «[az] {1,30}»
Entre una y 30 veces, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{1,30}»
Coincide con un solo carácter presente en la lista “-” «[-] {0,1}»
Entre cero y una, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{0,1}»
O haga coincidir la expresión regular número 2 a continuación (intente la siguiente alternativa solo si ésta falla) «[AZ] {1} [- \ '] {1} [AZ] {0,1} [az] {1,30} [ -] {0,1} »
Coincide con un solo carácter en el rango entre "A" y "Z" «[AZ] {1}»
Exactamente 1 vez «{1}»
Coincide con un solo carácter presente en la lista a continuación «[- \ '] {1}»
Exactamente 1 vez «{1}»
Uno de los caracteres “-” «-» Un 'carácter «\'»
Coincide con un solo carácter en el rango entre "A" y "Z" «[AZ] {0,1}»
Entre cero y una, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{0,1}»
Coincide con un solo carácter en el rango entre "a" y "z" «[az] {1,30}»
Entre una y 30 veces, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{1,30}»
Coincide con un solo carácter presente en la lista “-” «[-] {0,1}»
Entre cero y una, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{0,1}»
O haga coincidir la expresión regular número 3 a continuación (todo el grupo falla si esta no coincide) «[az] {1,2} [- \ '] {1} [AZ] {1} [az] {1,30} »
Coincide con un solo carácter en el rango entre "a" y "z" «[az] {1,2}»
Entre una y 2 veces, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{1,2}»
Coincide con un solo carácter en el rango entre “” y “'” «[- \'] {1}»
Exactamente 1 vez «{1}»
Coincide con un solo carácter en el rango entre "A" y "Z" «[AZ] {1}»
Exactamente 1 vez «{1}»
Coincide con un solo carácter en el rango entre "a" y "z" «[az] {1,30}»
Entre una y 30 veces, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{1,30}»
Sé que esta validación asume totalmente que cada persona que completa el formulario tiene un nombre occidental y eso puede eliminar a la gran mayoría de personas en el mundo. Sin embargo, siento que este es un paso en la dirección correcta. Quizás esta expresión regular sea demasiado básica para que los gurús la aborden de manera simplista o quizás haya alguna otra razón por la que no pude encontrar el código anterior en mis búsquedas. Pasé demasiado tiempo tratando de resolver esto, probablemente notarás cuán confusa está mi mente sobre todo esto si miras los nombres de mis pruebas a continuación.
Probé el código en los siguientes nombres y los resultados están entre paréntesis a la derecha de cada nombre.
- STEVE SMITH (falla)
- Stev3 Smith (falla)
- STeve Smith (falla)
- Steve SMith (falla)
- Steve Sm1th (pasó el Steve Sm)
- d'Are to Beaware (pasado el Are to Beaware)
- Jo Blow (pasado)
- Hyoung Kyoung Wu (fallecido)
- Mike O'Neal (pasado)
- Steve Johnson-Smith (aprobado)
- Jozef-Schmozev Hiemdel (aprobado)
- Oh Henry Smith (pasado)
- Mathais d'Arras (pasado)
- Martin Luther King Jr (aprobado)
- Centro-James Brown (aprobado)
- Darren McCarty (aprobado)
- George De FunkMaster (aprobado)
- Baloncesto Kurtis B-Ball (aprobado)
- Ahmad el Jeffe (fallecido)
Si tiene nombres básicos, debe haber más de uno hasta cinco para que funcione el código anterior, que son similares a los que usé durante las pruebas, este código podría ser para usted.
Si tiene alguna mejora, hágamelo saber. Solo estoy en las primeras etapas (los primeros meses de descubrir RegEx.
Gracias y buena suerte, Steve.