2013-10-27 65 views
6

我想匹配Url中的路径,但忽略查询字符串。 正则表达式应该在查询字符串之前包含一个可选的结尾斜杠。无查询字符串的匹配网址路径

示例网址,应该给有效匹配:

/path/?a=123&b=123 

/path?a=123&b=123 

所以字符串“/路径”应当匹配上述任一网址。

我曾尝试以下的正则表达式:(/path[^?]+).*

但是,这将只匹配像上面的第一个例子网址:/path/?a=123&b=123

任何想法如何,我会去得到它没有结尾的第二个例子匹配斜线呢?

正则表达式是一个要求。

+0

(/path[?]+|/path/[?]+).* – pasty

回答

3

无需正则表达式:

url.split("?")[0]; 

如果你真的需要它,那就试试这个:

\/path\?*.* 

编辑其实最精确的正则表达式应该是:

^(\/path)(\/?\?{0}|\/?\?{1}.*)$ 

,因为您要匹配/path/path//path?something/path/?something而没有别的。请注意,?表示“最多一个”,而\?表示一个问号。

BTW:什么样的路由库不处理查询字符串?我建议使用别的东西。

+0

我应该指出的是,我被要求使用正则表达式。我正在使用使用正则表达式来匹配网址的路由库。 – JCoder23

+0

@ JCoder23更新一次 – freakish

+0

Im使用CasperJS和PhantomJS网络服务器模块。 Web服务器模块是一个基本的http服务器(Mongoose),它没有内置路由。我发现有人为它写了一个[路由库](https://gist.github.com/trevordixon/3061477)不支持查询字符串,因为如果将查询字符串追加到url中,则url不匹配。所以我需要这个正则表达式来匹配没有查询字符串的路由,然后我修补了路由库以正确解析出查询字符串并将其添加到路由的请求对象中。 – JCoder23

3

http://jsfiddle.net/bJcX3/

var re = /(\/?[^?]*?)\?.*/; 

var p1 = "/path/to/something/?a=123&b=123"; 
var p2 = "/path/to/something/else?a=123&b=123"; 

var p1_matches = p1.match(re); 
var p2_matches = p2.match(re); 

document.write(p1_matches[1] + "<br>"); 
document.write(p2_matches[1] + "<br>"); 
+0

这也按预期工作,谢谢! – JCoder23