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

この正規表現を分解してみましょう。

/

正規表現を開始します。

.*

0 個以上の任意のものに一致 - 基本的に、この正規表現を文字列の任意の場所に一致させます。

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

これで、?:「このグループ内には何もキャプチャしない」という意味になります。http://www.regular-expressions.info/refadv.htmlを参照してください。

これは通常、「前のトークンの 0 または 1 つのコピーに一致する」ことを\?意味?する文字ですが、実際の ? に一致させたいと考えています。

それ以外は、選択するさまざまなオプションを探しているだけです(|「私の前または後のどちらかに一致する場合、正規表現は有効であることを意味します。」)

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

ここで、次の文字の 0 個以上を任意の配置で一致させます。a-ZA-Z0-9 +これは a の中にあるため()、no?:を使用してキャプチャします。

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

別のグループが表示?:されるので、これは別の非キャプチャ グループです。それ以外は、|s で区切られたリテラル文字でいっぱいなので、凝ったロジックは実行されません。

/

正規表現を終了します。

要約すると、この正規表現は文字列を調べて最初の非キャプチャ グループのインスタンスを探し、その中のすべてをキャプチャしてから、2 番目の非キャプチャ グループのインスタンスを探してそれを「キャップ」し、それら 2 つの間のすべてを返します。非捕獲グループ。(「サンドイッチ」と考えてください。ヘッダーとフッターを探して、その間にある関心のあるすべてのものをキャプチャします)

正規表現の実行後、次のようにします。

一致を返しますか?[1].split('+') : []; に一致します。

キャプチャされたグループを取得し、それ+を文字列の配列に分割します。

于 2013-04-12T01:06:05.183 に答える