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 匹配正则表达式模式时,如何修复“无效组”错误?

js截取相应的域名----正则匹配法 和校验Url 正则表达式

匹配url的正则表达式

不安全的 JavaScript 尝试使用 URL 访问框架

JavaScript中字符串匹配的switch语句

不安全的 JavaScript 尝试使用 URL 访问框架