Eu pesquisei e pesquisei e brinquei e brinquei com ele e, embora não seja perfeito, ele pode ajudar outras pessoas na tentativa de validar nomes e sobrenomes que foram fornecidos como uma variável.
No meu caso, essa variável é $ name.
Usei o seguinte código para meu 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
Estou aprendendo RegEx, mas tenho a explicação para o código fornecida pelo amigo RegEx.
Aqui está:
Afirmar a posição em um limite de palavra «\ b»
Combine a expressão regular abaixo e capture sua correspondência no número de referência anterior 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 e 5 vezes, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{2,5}»
* PRECISO DE AJUDA AQUI PARA ENTENDER AS RAMIFICAÇÕES DESTA NOTA *
Nota: Eu repeti o próprio grupo de captura. O grupo irá capturar apenas a última iteração. Coloque um grupo de captura ao redor do grupo repetido para capturar todas as iterações. «{2,5}»
Corresponde à expressão regular abaixo (tentando a próxima alternativa apenas se esta falhar) «[AZ] {1} [az] {1,30} [-] {0,1}»
Corresponde a um único caractere no intervalo entre “A” e “Z” «[AZ] {1}»
Exatamente 1 vez «{1}»
Corresponde a um único caractere no intervalo entre “a” e “z” «[az] {1,30}»
Entre uma e 30 vezes, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{1,30}»
Corresponde a um único caractere presente na lista “-” «[-] {0,1}»
Entre zero e uma vez, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{0,1}»
Ou corresponda à expressão regular número 2 abaixo (tentando a próxima alternativa apenas se esta falhar) «[AZ] {1} [- \ '] {1} [AZ] {0,1} [az] {1,30} [ -] {0,1} »
Corresponde a um único caractere no intervalo entre “A” e “Z” «[AZ] {1}»
Exatamente 1 vez «{1}»
Corresponde a um único caractere presente na lista abaixo «[- \ '] {1}»
Exatamente 1 vez «{1}»
Um dos caracteres “-” «-» Um 'caractere «\'»
Corresponde a um único caractere no intervalo entre “A” e “Z” «[AZ] {0,1}»
Entre zero e uma vez, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{0,1}»
Corresponde a um único caractere no intervalo entre “a” e “z” «[az] {1,30}»
Entre uma e 30 vezes, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{1,30}»
Corresponde a um único caractere presente na lista “-” «[-] {0,1}»
Entre zero e uma vez, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{0,1}»
Ou corresponda à expressão regular número 3 abaixo (o grupo inteiro falha se este não corresponder) «[az] {1,2} [- \ '] {1} [AZ] {1} [az] {1,30} »
Corresponde a um único caractere no intervalo entre “a” e “z” «[az] {1,2}»
Entre uma e 2 vezes, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{1,2}»
Corresponde a um único caractere no intervalo entre “” e “'” «[- \'] {1}»
Exatamente 1 vez «{1}»
Corresponde a um único caractere no intervalo entre “A” e “Z” «[AZ] {1}»
Exatamente 1 vez «{1}»
Corresponde a um único caractere no intervalo entre “a” e “z” «[az] {1,30}»
Entre uma e 30 vezes, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{1,30}»
Eu sei que esta validação assume totalmente que cada pessoa que preenche o formulário tem um nome ocidental e isso pode eliminar a grande maioria das pessoas no mundo. No entanto, sinto que este é um passo na direção certa. Talvez essa expressão regular seja muito básica para os gurus abordarem de forma simplista ou talvez haja algum outro motivo pelo qual não consegui encontrar o código acima em minhas pesquisas. Passei muito tempo tentando descobrir isso, você provavelmente perceberá como minha mente está nebulosa com tudo isso se olhar os nomes dos meus testes abaixo.
Testei o código com os nomes a seguir e os resultados estão entre parênteses à direita de cada nome.
- STEVE SMITH (reprovado)
- Stev3 Smith (reprovado)
- STeve Smith (reprovado)
- Steve SMith (reprovado)
- Steve Sm1th (aprovado no Steve Sm)
- d'Are to Beaware (passado no Are to Beaware)
- Jo Blow (aprovado)
- Hyoung Kyoung Wu (aprovado)
- Mike O'Neal (aprovado)
- Steve Johnson-Smith (aprovado)
- Jozef-Schmozev Hiemdel (aprovado)
- O Henry Smith (aprovado)
- Mathais d'Arras (aprovado)
- Martin Luther King Jr (aprovado)
- Downtown-James Brown (aprovado)
- Darren McCarty (aprovado)
- George De FunkMaster (aprovado)
- Kurtis B-Ball Basketball (aprovado)
- Ahmad el Jeffe (aprovado)
Se você tiver nomes básicos, deve haver mais de um até cinco para que o código acima funcione, que são semelhantes aos que usei durante o teste, este código pode ser para você.
Se você tiver alguma melhoria, por favor me avise. Estou apenas nos estágios iniciais (primeiros meses para descobrir o RegEx.
Obrigado e boa sorte Steve