Talvez me odeiem por isso, talvez me crucifiquem.. sei lá..

Acabei de ver este artigo, pelo Twitter.

Okay, a idéia é bacana, porém existem falhas nesse código apresentado.

Expressões Regulares são bem úteis, e o método .replace() da linguagem javascript, é muito simples de usar.

Vamos… melhorar a proposta.

Afinal de contas, toda vez que critico algo, aparece alguém dizendo ‘então faça você’, lá vai:

Não sei se era a intenção do criador, porém o script aceita espaço, apesar dele não ter citado isso no comentário.

// Somente letras maiúsculas e minúsculas e numeros
  $("#campo4").keyup(function() {
    var valor = $("#campo4").val().replace(/[^a-zA-Z 0-9]+/g,'');
    $("#campo4").val(valor);
  });

Nesse outro, aceita vírgulas… achei estranho..

// Somente valores definidos
  $("#campo5").keyup(function() {
    var valor = $("#campo5").val().replace(/[^2,4,6,8]+/g,'');
    $("#campo5").val(valor);
  });

alguém fora eu, percebeu uma repetição de código ?

// Descrição
  $( blablabla ).keyup(function() {
    var valor = $( blablabla ).val().replace(ER,'');
    $( blablabla ).val(valor);
  });

certo ?

Primeiro passo para melhorar, tornando reaproveitável, é encapsular numa function, e usar a palavra chave this, afinal ir no DOM, selecionar 3 vezes o mesmo elemento, é lento.. já que o js nos oferece um ponteiro de graça e muito bom para isso.

Primeiro, corrigindo o problema de performance, e a expressão regular:

// Somente valores definidos
  $("#campo5").keyup(function() {
    var $this = $( this ); //armazeno o ponteiro em uma variavel
    var valor = $this.val().replace(/[^2468]+/g,'');
    $this.val( valor );
  });

veja que uso uma variavel criada por mim var $this, para representar o objeto atual, e assim não precisar ficar indo no dom e procurando, e nem ‘rechamando’ o seletor jQuery.

Isso aqui:

// Somente letras maiúsculas e minúsculas e numeros```

conseguimos mais facilmente com o modificador **\i**

``` js
/[^a-z0-9]+/gi

Okay, hora de dar ‘o meu toque’, no script:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script type="text/javascript">
//inspirada na http://php.net/preg_replace
function er_replace( pattern, replacement, subject ){
  return subject.replace( pattern, replacement );
}
$(document).ready(function(){
  $("#campo1").keyup(function() {
    var $this = $( this );
    $this.val( er_replace( /[^0-9]+/g,'', $this.val() ) );
  });
  $("#campo2").keyup(function(){
    var $this = $( this );
    $this.val( er_replace( /[^a-z]+/g,'', $this.val() ) );
  });
  $("#campo3").keyup(function(){
    var $this = $( this );
    $this.val( er_replace( /[^a-z]+/gi,'', $this.val() ) );
  });
  $("#campo4").keyup(function(){
    var $this = $( this );
    $this.val( er_replace( /[^a-z0-9]+/gi,'', $this.val() ) );
  });
  $("#campo5").keyup(function() {
    var $this = $( this );
    $this.val( er_replace( /[^2468]+/g,'', $this.val() ) );
  });
});
</script>
<style type="text/css">
label { display: block; }
</style>

  <form action="" method="post">
    <label><input type="text" value="" id="campo1" />
    somente números</label>

    <label><input type="text" value="" id="campo2" />
    somente letras minúsculas</label>

    <label><input type="text" value="" id="campo3" />
    somente letras maiúsculas e minúsculas</label>

    <label><input type="text" value="" id="campo4" />
    somente letras maiúsculas e minúsculas e numeros</label>

    <label><input type="text" value="" id="campo5" />
    somente valores definidos (2,4,6,8)</label>
  </form>

hum… ainda estou incomodado.. que tal:

jQuery.fn.removeNot = function( settings ){
  var $this = jQuery( this );
  var defaults = {
    pattern: /[^0-9]/,
    replacement: ''
  }
  settings = jQuery.extend(defaults, settings);

  $this.keyup(function(){
    var new_value = $this.val().replace( settings.pattern, settings.replacement );
    $this.val( new_value );
  });
  return $this;
}
$(document).ready(function(){
  $("#campo1").removeNot({ pattern: /[^0-9]+/g });
  $("#campo2").removeNot({ pattern: /[^a-z]+/g });
  $("#campo3").removeNot({ pattern: /[^a-z]+/gi });
  $("#campo4").removeNot({ pattern: /[^a-z0-9]+/gi });
  $("#campo5").removeNot({ pattern: /[^2468]+/g });
});

Plugins são fantásticos ne?! lol