如何替换正则表达式中的许多字符?

时间:2010-03-17 20:33:54

标签: javascript jquery regex

我正在清理输入字段并手动获取和设置过程中的插入位置。通过一些抽象,这是基本的想法:

<input type="text" onkeyup"check(this)">

和javascript ...

function check(element) {
  var charPosition = getCaretPosition(element);
  $(element).val( sanitize( $(element).val() ) );
  setCaretPosition(element, charPosition);
}

function sanitize(s) {
  return s.replace(/[^a-zA-Z0-9\s]/g, '');
}

这个工作正常,除非一个角色确实被消毒了,我的插入位置是一个。基本上我想要一种方法来查看sanitize函数是否实际上已经替换了一个字符(以及在什么索引处),因此我可以在必要时调整charPosition。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

嗯,比较之前和之后的值会不会更简单,然后相应地进行补偿? -

charPosition -= beforeVal.length - afterVal.length; 

答案 1 :(得分:2)

J-P的回答对您的特定问题最简单。

一般来说,如果您想知道替换的结果,最简单的方法是编写自己的替换函数:

var numReplaced = 0;

function sanitize(s) {
    return s.replace(/[^a-zA-Z0-9\s]/g, replacementFunc);
}
function replacementFunc() {
    numReplaced += arguments[0].length;
    return "";
}

答案 2 :(得分:2)

我个人认为您应该重新考虑将更改为正在输入的数据。这是不寻常的,可能令人困惑。一种更好的技术可能是在视觉上通知用户,并可能禁止模糊或在onblur期间简单消毒。

或者,考虑使用onkeydown并返回false,如果键入了错误的键,这将使键完全短路,并且无需替换字段中的文本。

<input type="text" onkeydown="return check(event)">

虽然您必须手动处理键码,包括修饰符(shift,ctrl,...):

<script>
  function check(e) {
    var w = e.which;
    var k = e.ctrlKey||e.altKey||e.metaKey;
    var m = k||e.shiftKey;
    return (!k && w>=65&&w<90)    // a-z allowing shift
           ||(!m && w>=48&&w<=57) // 0-9 no modifiers
           ||(w>=33&&w<=40)       // navigation keys
           ||w==8                 // Backspace
           ||w==9                 // Tab
           ||w==13                // Return
           ||w==32                // Space
           ||w==46                // Delete
           ;
  }
</script>