改善条件结构?

时间:2013-08-22 12:42:51

标签: javascript regex

我正在编写一个脚本来检查浏览器中的当前网址并采取相应的行动,我的代码如下:

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,有没有办法改进这个代码,因为它看起来对我来说很愚蠢。

3 个答案:

答案 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/