0

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

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

4

3 回答 3

3

把你的引擎放在一个数组和循环中,

像这样的东西

   sengs = ['bing','google','yahoo'];
   foreach of yourarray {
        if(url.match("^https?://(www\.)?"+your value+"\..+$")){
            engine = your value;
        }
    }  
于 2013-08-22T12:49:39.507 回答
2

为什么不直接使用matchurl 从 url 中获取域名?它会使您的代码更短,并且您不需要每次都编写几乎相同的检查。

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;
}

编辑:现在你有了你的引擎名称,在 switch-case 中使用它(或者如果你更喜欢这些语句)并做你想做的事情。如果你这样做,你可以摆脱引擎阵列。

把所有这些放在一起,这段代码就是你所需要的:

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;
}
于 2013-08-22T12:56:36.163 回答
1

实际上,您可以在变量中为您正在寻找的 url 获取匹配位置。

像这样:

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/

于 2013-08-22T12:48:49.717 回答