2013-04-12 10 views
4

Я потратил несколько часов на это, и я не могу показаться, что это так.Функциональные возможности регулярных выражений Javascript

В приведенном ниже коде я пытаюсь понять, что и как работают регулярные выражения в 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); 
+0

Отформатируйте свой код и удалите ненужные пустые строки. –

+0

@LeeTaylor На нем. – Russell

ответ

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, поэтому он не делает никакой причудливой логики.

/ 

End regex.

Таким образом, это регулярное выражение просматривает строку для любого экземпляра первой группы, не захватившей ее, захватывает все внутри нее, а затем ищет любой экземпляр второй группы, не захватывающей ее, чтобы «закрыть» ее и вернуть все, что был между этими двумя группами, не связанными с захватом. (Думайте об этом как «сэндвич», мы ищем верхний и нижний колонтитулы и захватить все, что между ними, что мы заинтересованы в)

После регулярных выражений работает, мы делаем это:

Ответные матчи? matches [1] .split ('+'): [];

Которая захватывает захваченную группу и разбивает ее на + в массив строк.

+1

Очень приятное описание. – jahroy

+0

Вау, это именно то, что я искал. Большое вам спасибо за то, что нашли время, чтобы сломать это для меня. Теперь мне просто нужно выяснить, почему последний набор правил разбивает код. – Russell

4

Для ситуаций, подобных этому, очень полезно визуализировать его с помощью www.debuggex.com (который я построил). Он сразу показывает вам структуру вашего регулярного выражения и позволяет вам шаг за шагом проходить.

В этом случае причина, по которой он работает, когда вы удаляете последнюю часть своего регулярного выражения, состоит в том, что ни одна из строк &toggle=, &ie=utf-8 и т. Д. Не указана в вашем примере URL. Чтобы увидеть это, перетащите серый ползунок над тестовой строкой на debuggex, и вы увидите, что он никогда не пропускает & в этой последней группе.

+1

Спасибо, я искал что-то вроде этого – Patashu

+0

Очень приятно! Спасибо, что поделились. – Russell

Смежные вопросы