【问题标题】:Regex allowing certain non-alphanumeric characters允许某些非字母数字字符的正则表达式
【发布时间】:2017-12-15 11:36:44
【问题描述】:

我目前有一个在输入文本框中的按键触发的事件。我目前有一些正则表达式可以将输入限制为大多数情况下有效的字母数字。但是,我发现正则表达式仍然允许以下字符%.'

我可以为这些字符的 charCodes 返回 false,但我觉得 Regex 应该做验证字符的工作,或者在这种情况下使用 regex 有什么意义。

有谁知道我该如何纠正这个问题,使这些非字母数字字符无法通过验证?

编辑:添加代码片段

$('#nationalIdNumber').keypress(function(e) {

  var regex = new RegExp("^[a-zA-Z0-9]+$");
  var str = String.fromCharCode(!e.charCode ? e.which : e.charCode);

  if (regex.test(str) || e.keyCode === 8 || e.keyCode === 37 || e.keyCode === 39 || e.keyCode === 46) {
    return true;
  }

  e.preventDefault();
  return false;
});
<script src="https://code.jquery.com/jquery-3.2.1.js" integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE=" crossorigin="anonymous"></script>

<input id="nationalIdNumber" type="text" />

【问题讨论】:

  • 你在字符类中使用a-Z吗?给定的正则表达式应该可以正常工作。
  • 我在这里检查了你的正则表达式 regex101.com 并且它不允许 % 符号
  • 我已编辑问题以包含代码 sn-p,它显示了错误。我已经尝试过了,确实正则表达式允许%.'。我想这将是 js 本身的错误@Tushar @KhanjanBhatt
  • 因为数字 5%keyCode 是相同的,并且 fromCharCode 将为 % 按键提供 5,它允许这些字符。它甚至允许所有特殊字符!@#$%^&amp;*()_+

标签: jquery regex


【解决方案1】:

编辑

考虑到keyCode在不同浏览器中的问题,你可以尝试改变方法:

$('#nationalIdNumber').on('input',function() {
  $(this).val($(this).val().replace(/[^a-z0-9]/ig,''));
});

这将删除所有不是 a-zA-Z0-9 的内容,这样您不仅可以处理插入的文本按键,还可以处理粘贴和 ctrl-v


旧答案

正则表达式没问题,你必须从 if 中删除 e.keyCode === 37 || e.keyCode === 39 || e.keyCode === 46: 37 个结果到 %,39 个结果到 ' 和 46 个结果到 . 或更好,这是 shift+something 的组合

如果你想保持条件(该代码不按 shift),是左箭头,右箭头和删除)你必须在 e.shiftKey 上添加一个检查,比如 regex.test(str) || e.keyCode === 8 || (e.shiftKey === false &amp;&amp; (e.keyCode === 37 || e.keyCode === 39 || e.keyCode === 46))

【讨论】:

  • 这些键码允许左键、右键和删除键,因为这在 Mozilla / Safari 中是被阻止的。所以看起来在 Chrome 中它们也映射到非法字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多