Para fins de validação do site, preciso da validação do nome e do sobrenome.
Para o primeiro nome, deve conter apenas letras, pode ter várias palavras com espaços e ter no mínimo três caracteres, mas no máximo 30 caracteres. Uma string vazia não deve ser validada (por exemplo , Jason , jason , jason smith , jason smith , JASON , Jason smith , jason Smith e jason SMITH ).
Para o sobrenome, deve ser uma única palavra, apenas letras, com no mínimo três caracteres, mas no máximo 30 caracteres. Strings vazias não devem ser validadas (por exemplo , lazslo , Lazslo e LAZSLO ).
regex
validation
Hellnar
fonte
fonte
Respostas:
Não se esqueça de nomes como:
Isso deve funcionar para a maioria das coisas:
/^[a-z ,.'-]+$/i
OU Suporte nomes internacionais com Unicode super sweet:
/^[a-zA-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ∂ð ,.'-]+$/u
fonte
.
(ponto decimal / ponto / ponto final), pois é o caractere curinga regexp =)őŐűŰ
estão faltando,łŁ
assim como caracteres poloneses , para não mencionar vários caracteres lituanos e letões. Em vez disso, tente encontrar uma biblioteca que transforme os caracteres exóticos na versão adequada sem sotaque e, em seguida, escreva a/^[a-z ,.'-]+$/i
regexp.陳大文
não é um nome válido aqui?/^[\p{L}'][ \p{L}'-]*[\p{L}]$/u
, embora seja bastante indulgente.Você faz suposições falsas sobre o formato do nome e do sobrenome. Provavelmente, é melhor não validar o nome, exceto verificar se ele está vazio.
fonte
Depois de passar por todas essas respostas, descobri uma maneira de construir um pequeno regex que suporta a maioria dos idiomas e permite apenas caracteres de palavras. Ele ainda oferece suporte a alguns caracteres especiais, como hífens, espaços e apóstrofos. Eu testei em python e ele suporta os caracteres abaixo:
Caracteres suportados:
fonte
^[\w'\-,.]*[^_!¡?÷?¿\/\\+=@#$%ˆ&*(){}|~<>;:[\]]*$
^[^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$
Eu criei um regex personalizado para lidar com nomes:
Eu tentei esses tipos de nomes e descobri que funcionam perfeitamente
Meu RegEx se parece com isto:
Modelo MVC4:
Observe o duplo
\\
para caracteres de escapePara aqueles que são novos no RegEx, pensei em incluir uma explicação.
fonte
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:
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.
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
fonte
O primeiro nome seria
Se você precisa que a parte inteira do primeiro nome tenha menos de 30 letras, você precisa verificar isso separadamente, eu acho. A expressão
".{3,30}"
deve fazer isso.Seus requisitos de sobrenome se traduziriam em
mas você deve verificar isso. Existem muitos sobrenomes contendo espaços.
fonte
Como disse maček:
Não se esqueça de nomes como:
e para remover casos como:
Isso abrangerá mais casos:
fonte
Estou trabalhando no aplicativo que valida passaportes internacionais (ICAO). Oferecemos suporte apenas para caracteres em inglês. Embora a maioria dos caracteres nacionais estrangeiros possam ser representados por um caractere do alfabeto latino, por exemplo, è por e, existem vários caracteres nacionais que exigem uma letra extra para representá-los, como o trema alemão, que exige que um 'e' seja adicionado à letra por exemplo, ä por ae.
Este é o JavaScript Regex para os nomes e sobrenomes que usamos:
O número máximo de caracteres no passaporte internacional é de até 31 . Usamos maxlength = "31" para melhorar as mensagens de erro do word em vez de incluí-lo no regex.
Aqui está um snippet de nosso código em AngularJS 1.6 com formulário e tratamento de erros:
fonte
Eu uso:
E teste o comprimento máximo usando alguns outros meios
fonte
Este regex funciona para mim (estava usando no Angular 8):
Será inválido se houver: -
Exemplo de primeiro nome inválido (espaço em branco)
Exemplo de primeiro nome válido:
fonte
Para simplificar, você pode usar:
O que eu gosto sobre isso é que o sobrenome vem sempre depois do primeiro nome, então se você for inserir esses grupos correspondentes em um banco de dados e o nome for John M. Smith, o primeiro grupo será John M. , e o segundo grupo será Smith.
fonte
^ afirma a posição no início de uma linha.
\ p {L} corresponde a qualquer tipo de letra de qualquer idioma
{2,} Quantificador - Corresponde entre 2 e vezes ilimitadas, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso)
$ afirma a posição no final de uma linha
Portanto, deve ser um nome em qualquer idioma contendo pelo menos 2 letras (ou símbolos) sem números ou outros caracteres.
fonte
Então, com o cliente, criamos este regex louco:
fonte
Para nomes e sobrenomes, existem apenas 2 coisas que você deve procurar:
Aqui está minha expressão regular:
var regex = /^[A-Za-z-,]{3,20}?=.*\d)/
1. Comprimento
Aqui, o {3,20} restringe o comprimento da string entre 3 e 20 caracteres.
2. Conteúdo
A informação entre os colchetes [A-Za-z] permite caracteres maiúsculos e minúsculos. Todos os símbolos subsequentes (- ,.) também são permitidos.
fonte
É isso que eu uso.
Este regex aceita apenas nomes com caracteres mínimos, de
A-Z a-z ,space and -
.Exemplo de nomes:
O limite do caractere do nome é 3. Se você quiser alterar isso, modifique {3,} para {6,}
fonte
A expressão a seguir funcionará em qualquer linguagem compatível com UTF-16 e garantirá que haja no mínimo dois componentes para o nome (ou seja, primeiro + último), mas também permitirá qualquer número de nomes do meio.
No momento em que este livro foi escrito, parecia que nenhuma das outras respostas atendia a todos esses critérios. Even
^\p{L}{2,}$
, que é o mais próximo, fica aquém porque também corresponderá a caracteres "invisíveis", comoU+FEFF
(Zero Width No-Break Space).fonte
Experimente essas soluções, para máxima compatibilidade, como já postei aqui :
JavaScript:
var nm_re = /^(?:((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-.\s])){1,}(['’,\-\.]){0,1}){2,}(([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-. ]))*(([ ]+){0,1}(((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-\.\s])){1,})(['’\-,\.]){0,1}){2,}((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-\.\s])){2,})?)*)$/;
HTML5:
<input type="text" name="full_name" id="full_name" pattern="^(?:((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-.\s])){1,}(['’,\-\.]){0,1}){2,}(([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-. ]))*(([ ]+){0,1}(((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-\.\s])){1,})(['’\-,\.]){0,1}){2,}((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-\.\s])){2,})?)*)$" required>
fonte
Isso parece fazer o trabalho para mim:
fonte
Uma função simples usando preg_match em php
fonte
Nome completo com apenas um espaço em branco:
fonte
Se você quiser que o nome completo tenha entre 3 e 30 caracteres, sem restrições a palavras individuais, tente o seguinte:
Esteja ciente de que isso exclui todas as letras estrangeiras como é, è, à, ï.
Se você quiser que o limite de 3 a 30 caracteres se aplique a cada palavra individual, Jens regexp fará o trabalho.
fonte
fonte