说到Regex,我比门钉更笨,所以在制作Firefox扩展时,我向朋友求助,他给了我这个:
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(如.ru,.se,.fr,.in等)
换句话说,它只应与Google搜索匹配。
提前感谢您的帮助!
/瑞恩
答案 0 :(得分:2)
^https?://www\.google\.[a-z]{2,3}/q=
假设tld只有2-3个字母就可以了。如果你在正斜杠(/)之间使用它,你想要在这个正则表达式上转义它们。
答案 1 :(得分:2)
尝试
/^https?:\/\/(?:www\.)?google(?:\.[a-z]{2,3}){1,2}\/.*[&\?]q=[^&]+?/i
(?:\.[a-z]{2,3}){1,2}
与.com.au
,.co.uk
等匹配。
答案 2 :(得分: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
使用它,您可以通过执行以下操作来检查JavaScript中的URL:
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有问题的原因。
答案 3 :(得分:1)
var regex = /^https?:\/\/(www\.)?google\.[a-z]{2,3}\/([^/]*[\&]|[\?])q=.+$/i;
答案 4 :(得分:1)
将 ^ https?:// 添加到您已有模式的正面
所以这就是整个模式:
(^https?:\/\/www\.google.*?[?&]q=[^&]+)
我喜欢你所拥有的模式:它不会假设TLD长度为两个或三个字符。
答案 5 :(得分:0)
这样的东西?
/https?:\/\/(www)?\.google\.[a-z]{2,3}\/[?&]q=.+/