【问题标题】:Javascript: match slug of a URLJavascript:匹配 URL 的 slug
【发布时间】:2013-07-19 05:09:12
【问题描述】:

对于给定的 URL,我想使用 Javascript 和正则表达式检索其 slug。我尝试了以下方法,但它只匹配 h 而不是 This-is-the-slug-to-be-matched

var url = "http://www.domain.com/region/town/This-is-the-slug-to-be-matched;art6066,1184999";
var slug = url.match(/[a-z0-9-]/);

【问题讨论】:

  • URL 的哪一部分是它的“slug”?
  • 我总是读到“slug”作为精确描述网站标题的 URL 的可读部分。

标签: javascript regex


【解决方案1】:

如果我们可以假设 slug 总是在最后一个正斜杠之后,并且在最后一个正斜杠之后的第一个冒号之前:

> var url = "http://www.domain.com/region/town/This-is-the-slug-to-be-matched;art6066,1184999";
> var slug = url.split("/").pop().split(";")[0];

输出:

> console.log(slug);
  "This-is-the-slug-to-be-matched"

【讨论】:

    【解决方案2】:

    这将获取最后一个斜杠之后(/)和第一个半逗号(;)之前的值:

    var slug = url.substring(url.lastIndexOf('/')+1, url.indexOf(';'));
    

    所以在这种情况下,slug == "This-is-the-slug-to-be-matched"


    绩效考核

    比较.split.pop()答案和.subtring().lastIndexOf()函数,我的方法是at least 35% faster。得分 ~4m ops/sec~2.6m ops/sec

    如果性能对您来说很重要,您可能需要考虑我的回答。

    【讨论】:

    • 谢谢,但我不想匹配 art6066,1184999 部分。
    【解决方案3】:

    试试这个:

    var slug = url.match(/.*\/([-a-z0-9]+)/i)[1];
    

    .*\/ 跳过所有内容,直到最后一个 /[-a-z0-9]+ 匹配 1 个或多个字母数字或连字符。将后者放入(...) 使其成为捕获组,[1] 返回第一个捕获组。

    【讨论】:

    • 需要在+ 之后添加缺少的右括号以使其工作:url.match(/.*\/([-a-z0-9]+)/i) - 初始版本给出'无效的正则表达式:未终止的组'
    【解决方案4】:

    另一种方式(我假设你也想要 ;art6066,1184999 in slug)

    var url = "http://www.domain.com/region/town/This-is-the-slug-to-be-matched;art6066,1184999";   
    var slug = url.split('/').pop();
    

    根据 cr0 的评论更新

    var slug = url.split('/').pop().split(';')[0];
    

    【讨论】:

    • 我一直认为 slug 用于以一种你能记住的方式链接到一篇文章。所以我不明白为什么会有像articleid这样难以记忆的参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2020-05-17
    • 2020-12-13
    • 2017-03-15
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多