como verifico se o valor de um input não contém algum número ou caractere especial?
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
Mas eu quero que seja obrigatório colocar letras, números e caracteres especiais.
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
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