Como verificar se o valor de um input não contém algum número?

como verifico se o valor de um input não contém algum número ou caractere especial?

1 curtida

Se você quiser apenas letras é possível utilizar uma RegExp:

var validarInput = (value) => {
  if (!value) return false

  var reg = /^[a-zA-Z]*$/

  return reg.test(value)
}

console.log(validarInput('aBCdeF')) // true
console.log(validarInput('')) // false
console.log(validarInput('1')) // false
console.log(validarInput('!')) // false
console.log(validarInput('aBC1deF')) // false
console.log(validarInput('aBCdeF##')) // false
console.log(validarInput('123')) // false
console.log(validarInput('!@#')) // false
1 curtida

Mas eu quero que seja obrigatório colocar letras, números e caracteres especiais.

1 curtida

Dessa forma fica obrigatório informar pelo menos uma letra, um caractere especial e um numero.

var validarInput = (value) => {
  if (!value) return false

  var letra = /(?=(?:.*?[a-zA-Z]){1})/
  var especial = /(?=(?:.*?[!@#$%*()_+^&}{:;?.]){1})/
  var numero = /(?=(?:.*?[0-9]){1})/

  return letra.test(value) && especial.test(value) && numero.test(value)
}

console.log(validarInput('a1!')) // true
console.log(validarInput('aBCdeF')) // false
console.log(validarInput('')) // false
console.log(validarInput('1')) // false
console.log(validarInput('!')) // false
console.log(validarInput('aBC1deF')) // false
console.log(validarInput('aBCdeF##')) // false
console.log(validarInput('123')) // false
console.log(validarInput('!@#')) // false
1 curtida

Vc pode usar regex, algo como:

// tem pelo menos um caractere especial, uma letra (maiúscula ou minúscula) e um número, e tem de 8 a 20 caracteres 
let regex = /^(?=.*[@!#$%^&*()/\\])(?=.*[0-9])(?=.*[A-Za-z])[@!#$%^&*()/\\a-zA-Z0-9]{8,20}$/; 
console.log(regex.test('a@4DFFd$fd')); // true 
console.log(regex.test('abc123$()')); // false (não tem letra maiúscula) 

Lembrando que “caractere especial” é uma definição muito vaga. Vc tem que definir bem a lista dos caracteres que quer. No exemplo acima, considerei @!#$%^&*()/\, mas vc pode mudar para o que precisar.

E no final também incluí um trecho que verifica se tem de 8 a 20 caracteres (é só um exemplo, pode mudar para os tamanhos que desejar).

Também coloquei os marcadores ^ e $, que indicam o início e fim da string. Assim eu garanto que só pode ter o que está na regex (não pode ter nada diferente disso).

Mas também daria para fazer algo mais “manual”:

function validar(string, especiais){
    // primeiro valida o tamanho
    if (string.length < 8 || string.length > 20) {
        return false;
    }
    let especial = 0, letra = 0, numero = 0;
    for (let i = 0; i < string.length; i++) {
        const char = string[i];
        if (('a' <= char && char <= 'z') || ('A' <= char && char <= 'Z')) {
            letra++;
        } else if ('0' <= char && char <= '9') {
            numero++;
        } else if (especiais.has(char)) {
            especial++;
        } else {
            // não pode ter outro tipo de caractere
            return false;
        }
    }
    return especial > 0 && letra > 0 && numero > 0;
}

// lista de caracteres especiais (usando Set para a busca ser mais rápida do que em um array) 
const especiais = new Set(['@', '!', '#', '$', '%', '^', '&', '*', '(', ')', '/', '\\']); 
console.log(validar('a@4DFFd$fd', especiais)); // true 
console.log(validar('abc123$()_', especiais)); // false (tem o caractere "_" que não faz parte da lista)

Parece pior porque “tem mais linhas”, mas tem outros aspectos a se considerar:

  • qual é mais fácil de ler e entender (e também modificar, caso precise alterar alguma regra)?
  • regex é bem mais lenta (veja aqui) - claro que para poucas strings pequenas a diferença será insignificante, mas se for tratar um grande volume de dados, pode começar a fazer diferença
1 curtida