使用 jQuery 限制重复字符的数量,但保留句点



我使用此代码来避免用户连续重复一个字符超过 3 次("bbb","ddd"左右...(:

$('.limitRepeaters').keypress(function(){
if (/(.)1{2,}/.test($(this).val())) {
return false;
}
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="limitRepeaters">

现在我希望用户能够重复"句点"字符三次(...(,所以我尝试了:

$('.limitRepeaters').keypress(function(e){
var code = e.keyCode || e.which;
if ((/(.)1{2,}/.test($(this).val())) && (code != '190')) {
return false;
}
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="limitRepeaters">

但这似乎行不通。 有什么想法吗?

编辑

我现在明白了问题。 实际上当用户在写"..."没有键入 190 键代码,因此需要将 190 键代码添加到正则表达式本身。知道怎么做吗?

使用您提到的相同块,但进行了以下更改。

$('.limitRepeaters').keypress(function(){
var str = $(this).val();
if (/(.)1{2,}/.test(str.replace(/[...]/g,''))) {
return false;
}
});

在上面的代码中,我替换了字符串中出现的所有 (...(。如果您不希望所有事件都使用if (/(.)1{2,}/.test(str.replace('...',''))) {

现在如果得到的话是:

$('.limitRepeaters').keypress(function(){
var str = $(this).val();
if (/(.)1{2,}/.test(str.replace(/[...]/g,'')) || /(.)1{3,}/.test($(this).val())) {
return false;
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="limitRepeaters"/>

这似乎有点长,也会让用户写 4 次(但这还不错...... 任何较短的想法都将受到欢迎。

要测试是否有任何字符重复 3 次或更多次,除了.,可以使用/([^.])1{3,}/。但是,在当前实现中,一旦达到匹配项,也不允许使用退格键或其他字符。

另一种方法是在 keyup 中重置为旧值,尽管这有点"生涩"(更简化的解决方案是使用光标位置和按下键生成预期值,但功能上以下内容更容易(

var oldValue;
$('.limitRepeaters').keypress(function(e){
	oldValue=  {val : this.value, pos : this.selectionStart }; //strictly speaking selectionEnd should be kept as well
}).keyup(function(e){
	if (/([^.])1{3,}/.test(this.value)) {
	this.value = oldValue.val;
this.selectionStart = oldValue.pos;
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="limitRepeaters">

再说一次,也许一旦输入三个重复字符就阻止所有其他输入是目标,这根本不需要:)。在这种情况下,/([^.])1{3,}/可以直接在现有代码中使用。

最新更新