4

我有一个像这样的网址:

图片/媒体组/橄榄球联盟节目封面 3436?sort=title

或者

图片/媒体组/橄榄球联盟节目封面 3436

我需要在媒体组之后得到所有东西,而不是包括?或之后的任何东西。

所以在这两种情况下rugby-league-programme-covers-3436都是我需要返回的

我使用了正则表达式/media-group/(.*)\?,它适用于有查询字符串的实例,但不适用于没有查询字符串的实例。

我正在使用下面的代码

var patt=new RegExp('/media-group/(.*)\?');
return patt.exec(url)[1];

您对此的帮助将不胜感激

4

1 回答 1

5

我相信最好的模式是:

/^[^\#\?]+\/media-group\/([^\?]+).*$/

爆发为:

^                 - start of string
[^\#\?]+          - one or more non-hash, non-question-marks
\/                - literal char
media-group       - literal chars
\/                - literal char
(                 - start capture group
  [^\?]+          - one or more chars non-question-marks
)                 - end of capture group
.*                - zero or more chars
$                 - end of string

这样做的原因是因为 [^\?]+ 是“贪婪的”,因为它将尝试最长可能的匹配,其中包含一个问号后跟任意字符,或者什么都不包含,因为字符串末尾的所有字符已经在非问号捕获组中捕获。

所以,使用

var RE=new RegExp(/^[^\#\?]+\/media-group\/([^\?]+).*$/),
    url="image/media-group/rugby-league-programme-covers-3436?sort=title";

console.log(url.match(RE)[1])

prints:rugby-league-programme-covers-3436并将 url 更改为image/media-group/rugby-league-programme-covers-3436,会产生相同的结果。

更新

修改了 David Foerster 的评论模式。

于 2013-07-16T23:35:33.413 回答