2012-01-17 5 views
1

Когда дело доходит до Regex Я глупее двери гвоздь, поэтому, делая расширение Firefox, я попросил друга о помощи, и он дал мне это:Javascript: Regex необходима помощь, пожалуйста,

if(doc.location.href.match(/(www\.google.*?[?&]q=[^&]+)/i)) 

но AMO редактор отклонил это сказав, что это слишком широки (например, он будет соответствовать http://uptime.netcraft.com/up/graph?site=www.google.com), кто-то может мне помочь/дать мне регулярное выражение, которое соответствует следующим образом (в соответствии с редактором он должен соответствовать в основном это): http(s)://www.google.tld/q=*

Так, например, он должен соответствовать http или https (нормальный и безопасный), а также любому tld после Google (например, .r u, .se, .fr, .in и т. д.)

Другими словами, это должно соответствовать поиску Google.

Заранее благодарим за вашу помощь!

/Ryan

ответ

2

Попробуйте

/^https?:\/\/(?:www\.)?google(?:\.[a-z]{2,3}){1,2}\/.*[&\?]q=[^&]+?/i 

(?:\.[a-z]{2,3}){1,2}, чтобы соответствовать как .com.au, .co.uk и т.д.

+0

Столько хороших ответов, но так как я использовал это, выбрал это :) Спасибо всем! – Ryan

+0

Это очень хорошо, но обратите внимание, что он фактически не соответствует URL-адресу http (s): //www.google.tld/q=*, так как он ожидает [& \?] До «q =». В реальном мире это есть, так что, возможно, редактор здесь один неправильно :) – eis

2
^https?://www\.google\.[a-z]{2,3}/q= 

предполагая только 2-3 буквы для TLD будет нормально. Если вы используете его между прямыми косыми чертами (/), вы хотите избежать их в этом регулярном выражении.

0

Что-то вроде этого?

/https?:\/\/(www)?\.google\.[a-z]{2,3}\/[?&]q=.+/ 
+0

Это пропустит 'http: //www.google.com/? Client = something & q = query' –

+0

Протокол и имя хоста могут быть сделаны без учета регистра, но 'q' не должно быть. –

1
var regex = /^https?:\/\/(www\.)?google\.[a-z]{2,3}\/([^/]*[\&]|[\?])q=.+$/i; 
1

Добавить ^https: //? к передней части рисунка у вас уже есть

  • ^привязывает шаблон к началу строки
  • HTTP просто http
  • s? означает 1 или 0 S'S
  • : это просто само по себе
  • обратные косые должны быть экранированы

так это целая картина:

(^https?:\/\/www\.google.*?[?&]q=[^&]+) 

, что я, как об образце у вас есть: это не предполагает, что TLD имеют длину два или три символа.

2

Не пытайтесь адаптировать регулярное выражение. Это будет немыслимо - если вы не можете найти проблему с этим сегодня, какая надежда заставит сопровождающего найти проблему с этим завтра?

Правильно проанализируйте URL-адрес, возможно, используя регулярное выражение, которое не нужно поддерживать, поскольку синтаксис основного URL-адреса не изменяется.

От RFC 3986:

следующая строка является регулярным выражением для взлома вниз хорошо сформированной URI ссылки на компоненты.

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 
12   3 4   5  6 7  8 9 

Цифры во второй строке выше предназначены только для удобства чтения; , они указывают контрольные точки для каждого подвыражения (т.е. каждая парная скобка). Мы ссылаемся на значение, согласованное для подвыражения <n> как $<n>. Например, соответствие приведенное выше выражение для

http://www.ics.uci.edu/pub/ietf/uri/#Related 

результаты в следующих матчах подвыражений:

$1 = http: 
$2 = http 
$3 = //www.ics.uci.edu 
$4 = www.ics.uci.edu 
$5 = /pub/ietf/uri/ 
$6 = <undefined> 
$7 = <undefined> 
$8 = #Related 
$9 = Related 

С помощью этого, вы можете проверить свой URL в JavaScript, выполнив следующие действия:

var match = url.match(/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/); 
if (!match) { throw new Error('not a URL'); } 
var url = { 
    protocol: match[2], 
    authority: match[4], // host, port, username, password 
    path: match[5], 
    query: match[6], 
    fragment: match[8] 
}; 
if (url.protocol !== 'http' && url.protocol !== 'https') { 
    throw new Error('bad protocol'); 
} 
if (!/^www.google.[a-z]+$/.test(url.authority || '')) { 
    throw new Error('bad host'); 
} 
if (!/[?&]q=/.test(url.query || '')) { 
    throw new Error('bad query'); 
} 

Это больше кода, но гораздо проще отлаживать, поддерживать и в качестве бонуса вы можете настроить свое объяснение, почему URL-адрес Matic.