正则表达式与网址

时间:2011-11-29 09:55:06

标签: javascript regex firefox-addon

我检查一个给定的URL是否与另一个URL匹配(可以有通配符)。

E.g。我有以下网址:

john.doe.de/foo

我现在想检查网址是否有效,用户定义要检查的字符串,例如:

*.doe.de/*

这样可以正常工作,但是如果有以下情况它不应该工作但是它会被接受:

*.doe.de

这里我写的函数到现在为止,url存储为firefox prefs,而“checkedLocationsArray”包含所有要检查的URL。

function checkURLS(index)
{
    if(index >= 0)
    {
    var pos = getPos("URL-Mask");
    var url = tables[index][pos];

    if(url != null && url != "")
    {
        var urlnow = "";
        if(redlist_pref.prefHasUserValue("table.1"))
        {
            var checkedLocationsArray = new Array();
            for(i = 0; i < tables.length; i++)
            {
                checkedLocationsArray[i] = tables[i][pos];
            }

            for(i=0;i<checkedLocationsArray.length;i++)
            {
                urlnow = checkedLocationsArray[i];

                if(urlnow == url)
                {
                    return true;
                }

                if(urlnow.indexOf('*.') != -1)
                {
                    while(urlnow.indexOf("*.") != -1)
                        urlnow = urlnow.replace("\*.", "\.[^\.]*");
                }
                if(urlnow.indexOf('.*') != -1)
                {
                    while(urlnow.indexOf(".*") != -1)
                        urlnow = urlnow.replace(".\*", "([^\.]*\.)");
                }
                if(urlnow.indexOf('/*') != -1)
                {
                    while(urlnow.indexOf("/*") != -1)
                        urlnow = urlnow.replace("/*", /\S\+*/)
                }
                else if(url.lastIndexOf('/') != -1)
                {
                    return false;
                }

                var regex = new RegExp(urlnow);
                var Erg = regex.exec(url);
                if(Erg != null)
                    return true;
            }
        }
        return false;
    }
}
}

我认为“else if(url.indexOf('/')!= -1)”是重要的部分。它应该工作得很好,如果我提醒它我甚至得到结果是真的但似乎没有被执行.. 如果有任何不清楚的地方,请发表评论。提前谢谢!

3 个答案:

答案 0 :(得分:1)

为什么不直接添加字符串开头和结尾的字符?

function checkURLS(index)
{
    if(index >= 0)
    {
        var pos = getPos("URL-Mask");
        var url = tables[index][pos];

        if(url != null && url != "")
        {
            var urlnow = "";
            if(redlist_pref.prefHasUserValue("table.1"))
            {
                var checkedLocationsArray = new Array();
                for(i = 0; i < tables.length; i++)
                {
                    checkedLocationsArray[i] = tables[i][pos];
                }

                for(i=0;i<checkedLocationsArray.length;i++)
                {
                    urlnow = checkedLocationsArray[i];

                    if(urlnow == url)
                    {
                        return true;
                    }

                    //Check there's nothing else in the string
                    urlnow = '^' + urlnow + '$';

                    if(urlnow.indexOf('*') != -1)
                    {
                        while(urlnow.indexOf("*") != -1)
                            urlnow = urlnow.replace("\*", ".*");
                    }
                    else if(urlnow.lastIndexOf('/') != -1)
                    {
                        return false;
                    }

                    var regex = new RegExp(urlnow);
                    var Erg = regex.exec(url);
                    if(Erg != null)
                        return true;
                }
            }
            return false;
        }
    }
}

答案 1 :(得分:1)

问题似乎是您没有检查字符串的开头和结尾。将您的代码更改为

urlnow = '^'+urlnow+'$'; // this is new
var regex = new RegExp(urlnow);

^是string-start的RegExp代码,{ - 1}}是string-end的代码。这样你就可以确保整个网址必须与模式匹配,而不仅仅是模式的一部分。

答案 2 :(得分:0)

我发现我做的网址不是当前的网址,我在下面改了。

我还改变了*现在被正则表达式替换,在这种情况下点必须存在。

function redlist_checkURLS(index)
{
if(index >= 0)
{
    var pos = getPos("URL-Mask");
    var url = currenturl.replace("http://", "");

    if(url != null && url != "")
    {
        var urlnow = "";
        if(pref.prefHasUserValue("table.1"))
        {
            var urlsok = 0;
            var checkedLocationsArray = new Array();
            for(i = 0; i < tables.length; i++)
            {
                checkedLocationsArray[i] = tables[i][pos];
            }

            for(i=0;i<checkedLocationsArray.length;i++)
            {
                urlnow = checkedLocationsArray[i];

                if(urlnow == url)
                {
                    return true;
                }

                if(urlnow.indexOf('*') != -1)
                {
                    while(urlnow.indexOf("*") != -1)
                        urlnow = urlnow.replace("*", "\\S+")
                }

                var regex = new RegExp(urlnow);
                var Erg = regex.exec(url);

                if(Erg != null && Erg == url)
                    return true;
            }
        }
        return false;
    }
}
}

感谢您的帮助!