2013-02-05 42 views
0

我已经搜索了JavaScript解决方案(在jQuery库中)获取URL参数的堆栈溢出。了解从jQuery get url参数函数的正则表达式

我有这个功能,是否可以平稳:

// get the firstname value from the myurl - http://mysite.com?firstname=dany&lastname=dughy 

var myurl = $("#gup").data("url"); 
var name = "firstname"; 

function gup(name, myurl) { 
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); 
    var regexS = "[\\?&]"+name+"=([^&#]*)"; 
    var regex = new RegExp(regexS); 
    var results = regex.exec(myurl); 
    if(results == null) 
     return ""; 
    else 
     return results[1]; 
} 

我理解它是如何工作的,你设置一个正则表达式,比执行一个正则表达式和检索一个数组的结果。

有人可以向我解释正则表达式吗?我似乎无法理解它。

回答

1

我们调用函数与gup("NAME","http://domain.com?NAME=value&name2=value2")

function gup(name, myurl) { 
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); 

此行逃逸方brakets所以它很好地工作在正则表达式查询,使得"[]""\\\[\\\]"

var regexS = "[\\?&]"+name+"=([^&#]*)"; 

现在名称被解析为在正则表达式中工作。它看起来像"[\\?&]NAME=([^&#]*)"

"[\\?&]"表示找到?&。由于?是一个特殊字符,要在文本中匹配?,您需要将其转义为\?,因此此正则表达式将变为[\?&],但在JavaScript字符串中,您需要再次跳过\。所以[\?&]在一个字符串中变成"[\\?&]"

=([^&#]*)与文字=相匹配,后面跟除&#之外的任何字符。

var regex = new RegExp(regexS); 
    var results = regex.exec(myurl); 
    if(results == null) 
     return ""; 
    else 
     return results[1]; 

返回捕获的组,位于位置1.位置0是整个匹配。

} 

函数调用返回value

+0

我真的不知道你必须在JS中再次逃避字符串(这使我感到困惑),我绝对需要在实际的正则表达式上多做一些工作。你为我开辟了一条伟大的道路。泰! –

+0

虽然不是'[\\?&]'找到\,'?或'&?正则表达式测试仪给我这个:http://i.imgur.com/UM0Pcok.png – eithed

+0

@eithed是的,它会,如果它是普通的正则表达式,但它是在一个JS字符串,所以你需要转义的'\'是用于逃避'?' –

0

比方说,您要搜索名字,那么正则表达式变为:[\\?&]firstname=([^&#]*)。现在,它的意思是:[\\?&]搜索任何字符\?&firstname=之后,和[^&#]* =什么,但&#字符之后

+0

泰非常回答。我相信杰勒德的答案更全面;这就是我接受它的原因。 –

+0

不用担心:) Regexpes很有趣。我认为虽然在解释'[\\?&]'时有一个小错误,因为它表示\,'?或'&(至少我认为它是:D)。让我把他的回答作为评论。 – eithed