Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.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/jQuery中从URL字符串检索日期_Javascript_Regex_Url_Date - Fatal编程技术网

在Javascript/jQuery中从URL字符串检索日期

在Javascript/jQuery中从URL字符串检索日期,javascript,regex,url,date,Javascript,Regex,Url,Date,我有一个WordPress网站,我正在使用AJAX更新归档文件,而不是重新加载页面(用非常基本的术语) 所以我可以通过: http://mysite.com/events/2012/10/17 http://mysite.com/events/2012/10 http://mysite.com/events/2012 我正在寻找一个JS/jQuery正则表达式方法,它将检索其中的任何一个。到目前为止,我有以下几点: var linkUrl = 'http://mysite.com/events

我有一个WordPress网站,我正在使用AJAX更新归档文件,而不是重新加载页面(用非常基本的术语)

所以我可以通过:

http://mysite.com/events/2012/10/17
http://mysite.com/events/2012/10
http://mysite.com/events/2012
我正在寻找一个JS/jQuery正则表达式方法,它将检索其中的任何一个。到目前为止,我有以下几点:

var linkUrl = 'http://mysite.com/events/2012/10';
var linkDate = linkUrl.match(/\d{4}(\/\d{2})+/);
console.log( linkDate ); // output - ["2012/10", "/10", index: 8, input: "/events/2012/10"] 

看起来它找到了2个匹配项,第二个不是我想要的。我确信这在我的正则表达式中很简单。

因此我在我可爱的O'Reilly正则表达式书中找到了解决方案

在再次查看我的正则表达式之后,我意识到月[日]表达式被括号包围,这显然意味着捕获子模式。解决办法就是这样

var linkUrl = "/events/2012/10/25";
var linkDate = linkUrl.match(/\d{4}(?:\/\d{2})*/);
// output - ["2012/10/25", index: 8, input: "/events/2012/10/25"] 
我在括号中添加了
?:
,它告诉
match
不要捕获子字符串。现在我分别收到
2012/10/17
2012/10
,具体取决于URL


由于正确排除了子模式,还请注意返回的单个值。

我将尝试使用这个regexp
/(\d{4})(?:\/(\d{2}))?(?:\/(\d{2}))?$/(\d{2})):

'http://mysite.com/events/2012'.match(/(\d{4})(?:\/(\d{2}))?(?:\/(\d{2}))?$/)
// => ["2012", "2012", undefined, undefined]

'http://mysite.com/events/2012/03'.match(/(\d{4})(?:\/(\d{2}))?(?:\/(\d{2}))?$/)
// => ["2012/03", "2012", "03", undefined]

'http://mysite.com/events/2012/03/21'.match(/(\d{4})(?:\/(\d{2}))?(?:\/(\d{2}))?$/)
// => ["2012/03/21", "2012", "03", "21"]
试试这个

(?<=/)[0-9]{4}(/[0-9]{1,2})?(/[0-9]{1,2})?

(?这显然是示例代码。在您的实际代码中,url是否位于正在单击的
元素中?是否检查此问题:?@CrazyTrain是的,这是示例代码,链接url由$(This.attr('href')填充这基本上给了我上面显示的内容。@JonathanNaguin我没有,这肯定是有帮助的,但是这个表达式比
/\d{4}\/\d{2}\/\d{2}稍微高级一些/
因为它总是只查找一天,而不是一个月。我发现了解决方案-发布在下面。你为什么关心它返回多少匹配项?只需使用
linkDate[0]
。谢谢你的回复,@dfsq。你的答案可以,但我觉得它有点凌乱(括号太多)。请参阅我的答案,以获得最有效的方法。@EricHolmes:“太多的括号”听起来就像是“太多的音符”的轶事。信不信由你,每一个括号都是必要的。@thg435实际上,它们不是。看看他的结果是如何产生
03
21
,以及
未定义的
,这是因为嵌套的括号(虽然不是必要的)正在创建一个不会被忽略的子模式捕获。我的子模式捕获更干净、更高效,并且正确地阻止了子模式。也许我误解了,但我看不出您的regexp有什么帮助:
'http://mysite.com/events/2012“.match(/\d{4}(?:\/\d{2})+/)
=>
null
”http://mysite.com/events/2012/02"比赛(/\d{4}(?:\/\d{2})+/)
=>
[“2012/02”]
。对我来说,它看起来没有多大帮助。但只要它对你有用,太好了!很好的一点-我的情况总是处理至少每月一次的档案。应该是这样-
/\d{4}(?:\/\d{2})*/
(更新答案)