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 = '';
}
});