Así que tengo un cuadro de texto en mi sitio web y lo he codificado para evitar que se usen ciertas palabras.
window.onload = function() {
var banned = ['MMM', 'XXX'];
document.getElementById('input_1_17').addEventListener('keyup', function(e) {
var text = document.getElementById('input_1_17').value;
for (var x = 0; x < banned.length; x++) {
if (text.toLowerCase().search(banned[x]) !== -1) {
alert(banned[x] + ' is not allowed!');
}
var regExp = new RegExp(banned[x]);
text = text.replace(regExp, '');
}
document.getElementById('input_1_17').value = text;
}, false);
}
El código funciona perfectamente y elimina el texto del cuadro de texto cuando todas las letras escritas están en minúsculas. El problema es que cuando el texto contiene una letra mayúscula, dará el error, pero la palabra no se eliminará del cuadro de texto.
4 respuestas
Normalmente, debe usar .toLowerCase()
con ambos lados al comparar strings
para que puedan coincidir lógicamente.
Pero el problema en realidad proviene del Regex que está utilizando, donde ignora mayúsculas y minúsculas , solo necesita agregar la bandera i
a ella:
var regExp = new RegExp(banned[x], 'gi');
text = text.replace(regExp, '');
Nota:
Tenga en cuenta también que no se recomienda el uso de alert()
en un bucle, puede cambiar su lógica para alertar a todos los elementos coincidentes en solo uno alert()
.
Parece que esperabas algo irracional. Las cadenas en minúsculas nunca coincidirán con cadenas que contengan letras mayúsculas.
Convierta ambos para comparar o use cadenas prohibidas en minúsculas. El primero sería más confiable, eliminando futuros errores humanos del proceso.
El RegExp
es un buena dirección, solo necesitas algunas banderas (para que sea mayúscula - i
nsensible, y g
lobal - entonces reemplaza todas las ocurrencias):
var text="Under the xxx\nUnder the XXx\nDarling it's MMM\nDown where it's mmM\nTake it from me";
console.log("Obscene:",text);
var banned=["XXX","MMM"];
banned.forEach(nastiness=>{
text=text.replace(new RegExp(nastiness,"gi"),"");
});
console.log("Okay:",text);
Lo que puede hacer es convertir ambas variables a mayúsculas o minúsculas.
if (text.toLowerCase().includes(banned[x].toLowerCase())) {
alert(banned[x] + ' is not allowed!');
}
No probado pero debería funcionar. No es necesario usar search
ya que no necesita el índice de todos modos. usar includes
es más limpio. incluye documentos
Preguntas relacionadas
Nuevas preguntas
javascript
Para preguntas sobre la programación en ECMAScript (JavaScript / JS) y sus diversos dialectos / implementaciones (excepto ActionScript). Incluya todas las etiquetas relevantes en su pregunta; por ejemplo, [node.js], [jquery], [json], etc.