2011-11-29 99 views
0

我檢查給定的url是否與另一個url匹配(可以有通配符)。正則表達式與網址

例如我有以下網址:

john.doe.de/foo 

我現在想查詢的網址是否有效與否,用戶定義要檢查的字符串與例如:

*.doe.de/* 

這工作正常,但具有下列不應該工作,但它被接受:

*.doe.de 

這裏我寫到現在的功能,URL存儲爲Firefox的首選項和我的「checkedLocationsArray」 containts要檢查所有的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)」是重要的部分。它應該工作得很好,如果我提醒它,我甚至會得到結果是真實的,但它似乎是如果沒有被執行.. 如果有什麼不清楚,請發表評論。提前致謝!

+0

對我來說,你想用'^ ... $'錨定表達式(匹配字符串的開頭和結尾)。 –

+0

@FelixKling你的意思是什麼?所有的工作都很好,只是如果pref中沒有'/ *'而url中出現'/'則函數不會返回false ......這與RegEx沒有關係,或者我誤解了?正如我添加的,代碼「url.lastIndexOf('/')!= -1」應該是「問題」。 – Termi

+0

那麼,從我的理解,如果你有'* .doe.de'作爲表達式,那麼你希望URL以'de'結尾。在這種情況下,您需要在表達式的末尾添加'$'來標記字符串的末尾。對於你給出的輸入,'url.lastIndexOf('/')!= -1'將是'false',所以我不明白你的困惑。你想讓它匹配嗎? –

回答

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

感謝您的幫助!

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

問題似乎是你不檢查字符串的開始和結束。你的代碼更改爲類似

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

^是字符串的開始和$字符串端代碼中的正則表達式代碼。這樣你就可以確保整個url必須匹配模式,而不僅僅是它的一部分。