Javascript:匹配 URL 的 slug
Posted
技术标签:
【中文标题】Javascript:匹配 URL 的 slug【英文标题】:Javascript: match slug of a URL 【发布时间】: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”? @Gabe etymology of "slug" 我总是读到“slug”作为精确描述网站标题的 URL 的可读部分。 【参考方案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这样难以记忆的参数。以上是关于Javascript:匹配 URL 的 slug的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 JavaScript 中使用 Gruber 的“改进的”URL 匹配正则表达式模式时,如何修复“无效组”错误?