Tengo este código:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>sss</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />


<script type='text/javascript'>
function isAlphabet(obj){

    var alphaExp = /[^a-z0-9_-]+/;
    if(!obj.value.match(alphaExp)){
        return true;
    }
    else{
        alert('the bad symbols');
        obj.focus();
        return false;
    }
}
</script>

</head>
<body>

    <form action="/">
        <input type='text' id='letters' onblur="isAlphabet(this)"/>
    </form>

</body>
</html>

Y quiero mostrar un Alert() que muestre solo aquellos caracteres para los que falla la validación.

Por ejemplo:

Si una entrada contiene símbolos como "#abc", el mensaje de alerta solo debe mostrar "#". ¿Cómo se puede hacer esto?

1
AlexC 20 jul. 2009 a las 15:26

5 respuestas

La mejor respuesta

Aquí hay una manera simple de hacerlo ... sin embargo, no es la más eficiente:

function isAlphabet(obj)
{
    var val = obj.value;
    var alphaExp = /[^a-z0-9_-]+/;

    var valid = true;
    var badchars = "";

    for( a = 0; a < val.length; a++ )
    {
        if(val[a].match(alphaExp))
        {
            badchars += "," + val[a];
            valid = false;
        }
    }

    if( !valid )
    {
        alert("The following characters are not allowed: " + badchars.substr(1));
        obj.focus();
    }

    return valid;
}
2
Kane Wallmann 20 jul. 2009 a las 11:34

Si usa el modificador g, puede obtener .match() para que le devuelva una serie de coincidencias (caracteres no válidos en su caso) y luego simplemente puede mostrarlos.

Consulte "String.match (patrón)" aproximadamente 1/3 en esta página: http://evolt.org/regexp_in_javascript

var str = "Watch out for the rock!".match(/r?or?/g)

Str entonces contiene ["o", "o", "ro"]

0
Andrew Bullock 20 jul. 2009 a las 11:39

En este caso, está haciendo coincidir caracteres que no entran en los rangos proporcionados. Por lo tanto, puede poner el texto coincidente en una referencia inversa y usarlo.

Alternativamente, puede construir un objeto Regexp y usarlo lastMatch propiedad.

1
Cerebrus 20 jul. 2009 a las 11:38

Puede hacer coincidir en regex que contiene todos los símbolos prohibidos (como su alphaExp), y luego concatenar las coincidencias.

0
EFraim 20 jul. 2009 a las 11:28

Use una expresión regular que coincida con los caracteres permitidos para obtener una cadena donde se eliminan. Si la cadena contiene algo, la validación falla:

function isAlphabet(obj) {
   var alphaExp = /[a-z0-9_-]+/g;
   var illegal = obj.value.replace(alphaExp, '');
   if (illegal.length){
      alert('Input contains the characters '+illegal+' which are not allowed.');
      obj.focus();
      return false;
   } else {
      return true;
   }
}
2
Guffa 20 jul. 2009 a las 11:47