我已经花了几个小时在这上面,我似乎无法想出这个.
在下面的代码中,我试图准确理解正则表达式的url.match工作原理和方式.
由于代码如下,它不起作用.但是,如果我删除(?:&toggle=|&ie=utf-8|&FORM=|&aq=|&x=|&gwp)它似乎给了我想要的输出.
但是,我不想在不了解它正在做什么的情况下删除它.
我找到了一个非常有用的资源,但几个小时后我仍无法准确确定这些表达式的作用:
有人可以为我解决这个问题并解释它是如何解析字符串的.表达本身和括号的位置对我来说并不是很清楚,坦率地说非常混乱.
任何帮助表示赞赏.
(function($) {
$(document).ready(function() {
function parse_keywords(url){
var matches = url.match(/.*(?:\?p=|\?q=|&q=|\?s=)([a-zA-Z0-9 +]*)(?:&toggle=|&ie=utf-8|&FORM=|&aq=|&x=|&gwp)/);
return matches ? matches[1].split('+') : [];
}
myRefUrl = "http://www.google.com/url?sa=f&rct=j&url=https://www.mydomain.com/&q=my+keyword+from+google&ei=fUpnUaage8niAKeiICgCA&usg=AFQjCNFAlKg_w5pZzrhwopwgD12c_8z_23Q";
myk1 = (parse_keywords(myRefUrl));
kw="";
for (i=0;i<myk1.length;i++) {
if (i == (myk1.length - 1)) {
kw = kw + myk1[i];
}
else {
kw = kw + myk1[i] + '%20';
}
}
console.log (kw);
if (kw != null && kw != "" && kw != " " && kw != "%20") {
orighref = $('a#applynlink').attr('href');
$('a#applynlink').attr('href', orighref + '&scbi=' + kw);
}
});
})(jQuery);
Run Code Online (Sandbox Code Playgroud)
让我们打破这个正则表达式.
/
Run Code Online (Sandbox Code Playgroud)
开始正则表达式.
.*
Run Code Online (Sandbox Code Playgroud)
匹配零或更多 - 基本上,我们愿意将此正则表达式随时匹配到字符串中.
(?:\?p=
|\?q=
|&q=
|\?s=)
Run Code Online (Sandbox Code Playgroud)
在这方面,?:手段"不捕获这个群体内的任何东西".见http://www.regular-expressions.info/refadv.html
该\?方法需要?从字面上看,这通常是一个汉字意为"匹配前面的标识0或1份",但我们想匹配的实际?
除此之外,它只是寻找多种不同的选项(|意思是"如果我匹配我之前或之后的正则,那么正则表达式是有效的.")
([a-zA-Z0-9 +]*)
Run Code Online (Sandbox Code Playgroud)
现在我们在任何排列中匹配以下任何字符中的零个或多个:a-ZA-Z0-9 +并且因为它在一个内部()没有?:我们DO捕获它.
(?:&toggle=
|&ie=utf-8
|&FORM=
|&aq=
|&x=
|&gwp)
Run Code Online (Sandbox Code Playgroud)
我们看到另一个,?:所以这是另一个非捕获组.除此之外,它只是由|s 分隔的文字字符,所以它没有做任何奇特的逻辑.
/
Run Code Online (Sandbox Code Playgroud)
结束正则表达式.
总之,这个正则表达式查看第一个非捕获组的任何实例的字符串,捕获其中的所有内容,然后查找第二个非捕获组的任何实例以"封顶"它并返回这两个之间的所有内容非捕获组.(把它想象成一个"三明治",我们寻找页眉和页脚,捕捉我们感兴趣的所有内容)
正则表达式运行后,我们这样做:
回归比赛?匹配[1] .split('+'):[];
它抓取捕获的组并将其拆分+为一个字符串数组.