我已经花了几个小时在这上面,我似乎无法想出这个。
在下面的代码中,我试图准确理解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);
答案 0 :(得分:5)
让我们打破这个正则表达式。
/
开始正则表达式。
.*
匹配零个或多个任何东西 - 基本上,我们愿意将此正则表达式随时匹配到字符串中。
(?:\?p=
|\?q=
|&q=
|\?s=)
在此,?:
表示“不捕获此组内的任何内容”。见http://www.regular-expressions.info/refadv.html
\?
表示从字面上取?
,这通常是一个字符,意思是'匹配前一个令牌的0或1个副本'但我们想要匹配实际的?。
除此之外,它只是在寻找多种不同的选项(|
意味着'正则表达式是有效的,如果我匹配在我之前或在我之后的那些。)
([a-zA-Z0-9 +]*)
现在我们在任何排列中匹配以下任何字符中的零个或多个:a-ZA-Z0-9 +
因为它位于()
内,没有?:
,我们会捕获它。
(?:&toggle=
|&ie=utf-8
|&FORM=
|&aq=
|&x=
|&gwp)
我们看到另一个?:
,所以这是另一个非捕获组。
除此之外,它只是由|
s分隔的文字字符,所以它没有做任何奇特的逻辑。
/
结束正则表达式。
总之,这个正则表达式查看第一个非捕获组的任何实例的字符串,捕获其中的所有内容,然后查找第二个非捕获组的任何实例以“封顶”它并返回所有的在这两个非捕获组之间。 (把它想象成一个“三明治”,我们寻找页眉和页脚,捕捉我们感兴趣的所有内容)
正则表达式运行后,我们这样做:
返回比赛?匹配[1] .split('+'):[];
抓取捕获的组并将其+
拆分为字符串数组。
答案 1 :(得分:4)
对于这样的情况,用www.debuggex.com(我建立的)可视化它真的很有用。它会立即显示正则表达式的结构,并允许您逐步完成。
在这种情况下,删除正则表达式的最后一部分时它的工作原因是因为所有字符串&toggle=
,&ie=utf-8
等都不在您的示例网址中。要看到这一点,请将调色板上方的灰色滑块拖到debuggex上,您将看到它永远不会超过最后一组中的&
。