我正在编写一个脚本来检查浏览器中的当前网址并采取相应的行动,我的代码如下:
if (url.match("^https?://(www\.)?bing\..+$")) {
engine = "bing";
} else {
if (url.match("^https?://(www\.)?google\..+$"))
engine = "google";
else
if (url.match("^https?://(www\.)?yahoo\..+$"))
engine = "yahoo";
else .... // etc.
}
对于8个网站来说,等等,我只是跟着if else,有没有办法改进这个代码,因为它看起来对我来说很愚蠢。
答案 0 :(得分:3)
将引擎放入数组并循环,
类似这样的事情
sengs = ['bing','google','yahoo'];
foreach of yourarray {
if(url.match("^https?://(www\.)?"+your value+"\..+$")){
engine = your value;
}
}
答案 1 :(得分:2)
为什么不直接使用网址上的match
从网址中获取域名?它会使你的代码变得更短,而且你不需要每次都编写几乎 - 同样的检查。
var engine = url.match(/:\/\/(.[^\.]+)/)[1];
这篇文章只抓取协议后的第一个单词,大多数网站都是www
。为了确保你获得正确的名称,你可以将它包装在一个带有额外检查的函数中:
function getDomainName(url) {
url = url.match(/:\/\/(.[^/]+)/)[1].split('.');
return url[url.length - 2].toLowerCase();
}
现在,调用getDomainName(url)
会返回您可以在以后使用的域名。
getDomainName('http://bing.com/'); // bing
getDomainName('http://www.google.com/'); // google
getDomainName('http://stackoverflow.com/questions/18380805/improve-the-conditional-structure/'); // stackoverflow
// and so on
现在您只需要检查此值是否在您接受的引擎数组中。这可以使用Array.indexof
完成。
var engines = ['google', 'bing', 'yahoo'];
var domain = getDomainName(url);
if (engines.indexOf(domain) > -1) {
engine = domain;
}
编辑:现在您已经获得了引擎名称,请在交换机案例中使用它(如果您更喜欢这些语句,则使用if语句)并执行您想要执行的操作。如果你这样做,你可以摆脱引擎阵列。
把所有这些放在一起,这段代码就是你需要的全部:
function getDomainName(url) {
url = url.match(/:\/\/(.[^/]+)/)[1].split('.');
return url[url.length - 2].toLowerCase();
}
switch (getDomainName(url)) {
case "google":
// do stuff for google's engine.
break;
case "bing":
// Do Bing stuff.
break;
case "yahoo":
// and so on
break;
default:
// None of the engines was found
break;
}
答案 2 :(得分:1)
实际上,您可以在变量中获取您要查找的网址的匹配位置。
像这样:
url = ['https://www.google.com','https://www.yahoo.com']
for (var i = 0; i<url.length; i++ )
{
var site = url[i].match("^https?://(www\.)?([A-Za-z0-9]+)\..+$")[2]
alert(site)
}
有了这个,你可以把它切换到你想做的任何事情:
switch(site) {
case "google": { /* do something..*/ } break;
case "yahoo" : { /* do something..*/ } break;
}
跟随工作小提琴http://jsfiddle.net/XPT3L/