【问题标题】:How do you replace many characters in a regex?如何替换正则表达式中的许多字符?
【发布时间】:2010-03-17 20:33:54
【问题描述】:

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

<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 。有什么想法吗?

【问题讨论】:

  • 如果您已经在使用 jQuery,则没有理由突兀地附加您的事件处理程序。相反,您应该在 JavaScript 中附加 onkeyup even 处理程序。
  • 其实是有原因的。这是针对 IE6 的大型 Web 应用程序(不幸的是),并且对 jQuery document.ready 有巨大的性能影响(在某些页面上超过 4 秒)。所以我试图从 document.ready 中提取尽可能多的东西。 (另外,这是一个需要 javascript 的 Intranet 应用程序,因此不需要担心突兀)

标签: javascript jquery regex


【解决方案1】:

嗯,比较前后的值,然后进行相应的补偿不是更简单吗? -

charPosition -= beforeVal.length - afterVal.length; 

【讨论】:

  • 您的第一个答案很棒,您编辑的答案更加高效。非常感谢!
【解决方案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 "";
}

【讨论】:

    【解决方案3】:

    我个人认为您应该重新考虑更改数据因为正在输入。这是不寻常的并且可能令人困惑。更好的技术可能是在视觉上通知用户,并可能禁止模糊或在 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>
    

    【讨论】:

    • 谢谢,这是一个很好的建议,我没有考虑过。我会尝试将此添加到我正在构建的框架中。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2018-07-13
    • 2015-11-30
    • 2017-02-04
    相关资源
    最近更新 更多