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.

-1
vctburk 30 sep. 2019 a las 16:20

4 respuestas

La mejor respuesta

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().

0
cнŝdk 30 sep. 2019 a las 15:17

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.

0
isherwood 30 sep. 2019 a las 13:28

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);
1
tevemadar 30 sep. 2019 a las 13:37

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

0
I am L 30 sep. 2019 a las 13:34