【问题标题】:Retrieving Date from a URL string in Javascript/jQuery从 Javascript/jQuery 中的 URL 字符串中检索日期
【发布时间】:2013-06-23 15:47:16
【问题描述】:

我有一个 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 个匹配项,其中第二个不是我想要的。我确信这在我的正则表达式中很简单。

【问题讨论】:

  • 这显然是示例代码。在您的实际代码中,<a> 元素中的 url 是否被点击?
  • 你检查过这个问题了吗:stackoverflow.com/questions/4478426/…?
  • @CrazyTrain 是的,这是示例代码,linkUrl 由 $(this).attr('href') 填充,这基本上给了我上面显示的内容。
  • @JonathanNaguin 我没有,它肯定很有帮助,但是这个表达式比/\d{4}\/\d{2}\/\d{2}/ 高级一点,因为它总是只查找一天,而不是每月。我发现了解决方案 - 发布在下面。
  • 你为什么关心它返回多少匹配?只需使用linkDate[0]。

标签: javascript regex url date


【解决方案1】:

我会试试这个正则表达式/(\d{4})(?:\/(\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"]

【讨论】:

  • 感谢@dfsq 的回复。你的可以,但对我来说看起来有点乱(括号太多)。请参阅我的答案以了解最有效的方法。
  • @EricHolmes:你的“太多括号”听起来就像“太多音符”的轶事。信不信由你,每一个都是必要的。
  • @thg435 实际上,他们不是。看看他的结果有03 和21 和undefined 吗?这是因为嵌套括号(虽然不是必需的)正在创建一个未被忽略的子模式捕获。我的更干净、更高效,并且可以正确屏蔽子模式。
  • 也许我误解了,但我看不出你的正则表达式有什么帮助:'http://mysite.com/events/2012'.match(/\d{4}(?:\/\d{2})+/) => null。 'http://mysite.com/events/2012/02'.match(/\d{4}(?:\/\d{2})+/) => ["2012/02"]。对我来说,它看起来不是很有帮助。但只要它对你有用,那就太好了!
  • 好点 - 我的情况总是至少每月处理一次档案。应该是这个-/\d{4}(?:\/\d{2})*/。 (更新答案)
【解决方案2】:

试试这个。

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

【讨论】:

    【解决方案3】:

    所以我在我可爱的 ​​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,具体取决于网址。

    还要注意返回的单个值,因为正确排除了子模式。

    【讨论】:

      猜你喜欢
      • 2018-02-08
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      相关资源
      最近更新 更多