4

我已经在这上面花了几个小时,但我似乎无法弄清楚这一点。

在下面的代码中,我试图准确了解其中的正则表达式是什么以及如何url.match工作。

由于代码如下,它不起作用。但是,如果我删除(?:&toggle=|&ie=utf-8|&FORM=|&aq=|&x=|&gwp)它似乎会给我我想要的输出。

但是,我不想在不了解它在做什么的情况下删除它。

我找到了一个非常有用的资源,但几个小时后我仍然无法准确确定这些表达式在做什么:

https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Regular_Expressions#Using_Parenthesized_Substring_Matches

有人可以为我分解一下并解释它是如何解析字符串的。表达式本身和括号的位置对我来说并不是很清楚,坦率地说非常令人困惑。

任何帮助表示赞赏。

(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);
4

2 回答 2

5

让我们分解这个正则表达式。

/

开始正则表达式。

.*

匹配零个或多个任何内容 - 基本上,我们愿意在字符串的任何位置将此正则表达式匹配。

(?:\?p=
|\?q=
|&q=
|\?s=)

在这方面,?:意思是“不要捕获该组内部的任何东西”。见http://www.regular-expressions.info/refadv.html

\?意思是字面意思,通常是一个字符,?意思是“匹配前一个标记的 0 或 1 个副本”,但我们想要匹配一个实际的 ?。

除此之外,它只是在寻找多种不同的选项来选择(|意味着'如果我匹配我之前或之后的内容,则正则表达式是有效的。)

([a-zA-Z0-9 +]*)

现在我们在任何排列中匹配零个或多个以下任何字符:a-ZA-Z0-9 +因为它在 a 内(),所以?:我们确实捕获它。

(?:&toggle=
|&ie=utf-8
|&FORM=
|&aq=
|&x=
|&gwp)

我们看到另一个?:,所以这是另一个非捕获组。除此之外,它只是充满了由|s 分隔的文字字符,所以它没有做任何花哨的逻辑。

/

结束正则表达式。

总之,这个正则表达式在字符串中查找第一个非捕获组的任何实例,捕获其中的所有内容,然后查找第二个非捕获组的任何实例以“限制”它并返回这两者之间的所有内容非捕获组。(把它想象成一个“三明治”,我们寻找页眉和页脚并捕获我们感兴趣的所有内容)

正则表达式运行后,我们这样做:

返回匹配项?匹配[1].split('+') : [];

它抓取捕获的组并将其拆分+为字符串数组。

于 2013-04-12T01:06:05.183 回答
4

对于这样的情况,使用www.debuggex.com(我构建的)将其可视化非常有帮助。它会立即向您显示正则表达式的结构,并允许您逐步完成。

在这种情况下,当您删除正则表达式的最后一部分时它起作用的原因是因为您的示例 url 中没有字符串&toggle=,&ie=utf-8等。要查看这一点,请在 debuggex 上拖动测试字符串上方的灰色滑块,您会看到它永远不会超过&最后一组中的。

于 2013-04-12T01:24:46.940 回答