如何限制同一个字符连续使用

How to restrict the same character from being used consecutively?

本文关键字:连续 字符 何限制 同一个      更新时间:2023-09-26

我正在尝试创建一个用户名输入,我想限制用户在按键上的输入。可以输入的字符数限制为固定前缀20+1。

我想要实现的是:

  1. 限制用户输入并仅接受A-Z、0-9、短划线(-)和下划线(_)。[已解决]
  2. 禁止用户以短划线(-)或下划线(_)作为用户名的开头。[已解决]
  3. 如果用户使用了下划线(_)和相反的下划线,则禁止用户使用短划线(-)。[已解决]
  4. 允许用户最多使用3个短划线(-)或3个下划线(_)。[虚线已解决]
  5. 禁止用户使用这样的连续符号(user___或user-p等)[需要帮助!]

我似乎不知道如何将下划线(_)限制为3个最大值,以及如何停止连续的短划线(-)和下划线(_。

如有任何帮助和适当的解释,我们将不胜感激!

我的HTML:

<form name = "RegForm" method="post" action="index.html" class="login">
    <input type="text" maxlength = "21" name="userID" id="userID"/>
</form>

我的JavaScript:

var userID_textfield = document.forms.RegForm.userID;
userID_textfield.onkeypress = function(e) {
    // Invalid character list
    var prohibited = "!@#$%^&*()+=;:`~'|'?/.><, '"";
    // List of characters that can't be first
    var posRestricted = "-_0123456789";
    // List of characters that can't be used more than once
    var numRestricted = "-_";
    // Get the actual character string value
    var key = String.fromCharCode(e.which);
    /* Goal:
       Validate: Accept only a-z, 0-9, - and _ */  
    if (prohibited.indexOf(key) >= 0) {
        console.log('Invalid key pressed');     
        return false;
    }
    else {
        /* Goals:
           1. Validate: -, _ and 0-9 can't be first
           2. Validate: - and _ can't be last if the userID is 21 characters long */
        if ((posRestricted.indexOf(key) >= 0 && this.value === "@") || (numRestricted.indexOf(key) >= 0 && this.value.length === 20)) {
            console.log("Username can't start with a number, a dash (-) or an underscore (_)");
            return false;
        }
        /* Goals:
           1. Validate: - and _ can't be used more than once each
           2. Validate: if - exists _ can't be used and the opposite' */
        else if (numRestricted.indexOf(key) >= 0) {
            var numResValue = [0, 0];
            for (var a = 0; a < numRestricted.length; a++) {
                for (var b = 0; b < this.value.length; b++) {
                    if (this.value.charAt(b) === numRestricted[a]) {
                       numResValue[a] += 1;
                    }
                }
            }
            for (var c = 0; c <= numResValue.length; c++) {
                if (numResValue[c] < 3) {
                    if (this.value.indexOf(numRestricted.replace(key, "")) === -1) {
                        return true;
                    }
                    else {
                        return false;
                    }
                }
                else {
                     return false;
                }
            }
        }
        else {
            return true;
        }
    } 
};

您可以在此处查看正在执行的代码。

您可以添加以下内容:(我更新了fiddle:https://jsfiddle.net/ck7f9t6x/5/)

    var lastKey = this.value.charAt(this.value.length-1);
          alert("lastKey = " + lastKey);
          if(lastKey == key){
            return false;
          }
          else{
          var numResValue = [0, 0];
          for (var a = 0; a < numRestricted.length; a++) {
            for (var b = 0; b < this.value.length; b++) {
              if (this.value.charAt(b) === numRestricted[a]) {
                numResValue[a] += 1;
              }
            }
    ...
}

您可以为这个东西编写一个函数,它将接受您的字符串并返回true或false(无论是否有效)

function checkConsecutive(string){
//break it to array
var a = string.split('');
//check for consecutive
for(i=0;i<a.length;i++){
if(a[i] == a[i+1]){
return true;
}else{
return false}
}
}

我知道这不是一个完美的解决方案,但它是可行的。

请参阅此JSFiddle

HTML

<input type="text" onkeypress="preventConsecutive(this, event)"/>

JavaScript

function preventConsecutive(el, evt) {
  if(el.value.length > 0) {
    var lastChar = el.value[el.value.length-1];
    if((lastChar === "-" && evt.keyCode === 45) || (lastChar === "_" && evt.keyCode === 95)) {
        evt.preventDefault();
        return;
    }
  }
}