Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果不是yyyy/mm/dd格式,是否删除当前输入?_Javascript_Jquery - Fatal编程技术网

Javascript 如果不是yyyy/mm/dd格式,是否删除当前输入?

Javascript 如果不是yyyy/mm/dd格式,是否删除当前输入?,javascript,jquery,Javascript,Jquery,如果输入数据与yyyy/mm/dd格式不匹配,我想删除它!我尝试了以下内容,但只删除了字母和特殊字符 例如 20144->必须删除最后4个 2014/->必须删除最后一个/ 2014/01/123->必须删除最后3个 $(“输入”)。在(“键控”,函数()上{ console.log(this.value); this.value=this.value.replace(/[^(\d{4})\/(\d{1,2})\/(\d{1,2})]/g'; }); 一旦你真正分解了你想要的东西的逻辑,这个策

如果输入数据与
yyyy/mm/dd
格式不匹配,我想删除它!我尝试了以下内容,但只删除了字母和特殊字符

例如

20144->必须删除最后4个
2014/->必须删除最后一个/
2014/01/123->必须删除最后3个

$(“输入”)。在(“键控”,函数()上{
console.log(this.value);
this.value=this.value.replace(/[^(\d{4})\/(\d{1,2})\/(\d{1,2})]/g';
});

一旦你真正分解了你想要的东西的逻辑,这个策略实际上非常简单。因此,您希望强制用户输入为
YYYY/MM/DD
格式。我们可以逐步做到这一点:

  • /
    字符拆分输入值。现在你得到一个数组
  • 我们保留数组的前三个元素,它们分别对应于
    YYYY
    MM
    DD
    。我们将忽略后面的任何片段,因为它们不是有效日期的一部分。这可以使用阵列上的
    .slice(0,3)
    完成
  • 分析数组的每个单独部分:
    • 在索引
      0
      处,您有年份片段。使用
      .substring(0,4)
      将其最多修剪为4个字符
    • 1
      2
      的索引中,分别有月/日片段。使用
      .substring(0,2)
      将其最多修剪为2个字符
  • 使用
    .Join(“/”)
    将结果数组重新联接
  • 如果数组包含空元素,则字符串中会出现重复的
    /
    。只需使用正则表达式将它们修剪掉,
    。替换(/\/(\/)+/,“/”)
  • 您会注意到,在我的逻辑中,我没有包括填充数字,例如。 . 将天数从
    1
    转换为
    01
    。当用户输入时,您不能这样做,因为您永远不知道用户是否打算键入一位或两位数字。如果需要,则必须重新分析输入
    onblur
    ,因为此时您知道用户已完成输入

    见下面的概念证明:

    $('input')。在('keyup',function()上{
    var valueParts=this.value.split('/');
    如果(!valueParts.length){
    返回;
    }
    //仅保留数组的前3个元素
    valueParts=valueParts.slice(0,3);
    //子字符串数组(保留年的前4个字符,保留月/日的前2个字符)
    var substringCounts=[4,2,2];
    forEach(函数(substringCount,索引){
    //如果数组中不存在索引,请跳过它
    如果(!valueParts[索引])
    返回;
    valueParts[index]=valueParts[index]。子字符串(0,子字符串计数);
    });
    //连接其余元素
    var parsedString=valueParts.join('/');
    //修剪多余的斜线
    parsedString=parsedString.replace(/\/(\/)+/,“/”);
    this.value=parsedString;
    });
    
    因为我确实认为纯正则表达式在解决这个问题上会非常糟糕,所以你可以只做一个手动过程,比如

    var good='2013/01/01';
    变量bad1='20123/01/02';
    var bad2='2011//01/03';
    var bad3='2010/01/034';
    var bad4='2009//01/045';
    变量bad5='20083//01/223';
    var all=[good,bad1,bad2,bad3,bad4,bad5];
    函数normalizeDate(日期字符串){
    var currentValue=dateString.replace(//\/{2,}/g,'/');//删除重复/
    var parts=currentValue.split('/').map(函数(值){
    返回值。替换(/\D/g,'0');
    });
    var newParts=[
    零件[0]?零件[0]。焊盘端(4,'0')。子字符串(0,4):'2000',
    零件[1]?零件[1]。焊盘起始(2,'0')。子字符串(0,2):'01',
    零件[2]?零件[2]。焊盘起始(2,'0')。子字符串(0,2):'01'
    ];
    返回newParts.join('/');
    }
    对于(变量i=0;i

    这将只匹配格式
    YYYY/MM/DD

    谢谢大家的回答!我参考你的答案,我可以找出解决我的愿望

    我相信有更好的解决方案,所以如果你们有更好的解决方案,请回答这里的问题

    var格式=[“数字”、“数字”、“数字”、“数字”、“斜杠”、“数字”、“数字”、“斜杠”、“数字”、“数字”、“数字”];
    $(“输入”)。在(“键控”,函数()上{
    if(this.value.length>format.length){
    this.value=this.value.slice(0,format.length);
    返回;
    }
    for(此.value中的变量i){
    if(格式[i]=“数字”){
    如果(!this.value[i].匹配(/[0-9]/){
    this.value=this.value.slice(0,i);
    }
    }否则{
    如果(此.value[i]!=“/”){
    this.value=this.value.slice(0,i);
    }
    }
    }
    });
    
    也许这可以帮助您在斜杠(/)上拆分日期,然后分别处理年、月和日会更容易。例如,this.value.split(“/”)
    $("input").on("keyup", function() {
       var validationRegex = new RegExp(/([12]\d{3}\/(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01]))/);
       if(!validationRegex.test(this.value)){
         this.value = '';
       }
    });