2012-03-17 79 views
0

我有一個名爲blacklist.txt的txt文件。我需要檢查輸入的$fullURL或其任何子域是否在文件中,如果沒有,請執行一些功能。我已經做了這個代碼,但它總是迴響$bannedmsg,我做錯了什麼?檢查TXT文件是否有重合

$blacklist = file("./blacklist.txt"); 
$words = "/.*"; 
foreach ($blacklist as $zeile){ 
    if ($zeile == $blacklist[count($blacklist)-1]){ 
     $words .= trim($zeile); 
    }else{ 
     $words .= trim($zeile); 
     $words .= "|"; 
    } 
} 
$words .= ".*/"; 
preg_match($words, $fullURL, $results); 
if(empty($results)){ 
    // Do the function 
}else{ 
    //This is banned, echo $bannedmsg and die() 
} 
+0

你確定'blacklist.txt'不包含任何空行嗎?你是否嘗試過打印'$ words'以確保它看起來正確? (順便說一句,我認爲你應該在'$ words'的開始和結尾刪除'。*';這是沒有必要的和誤導性的。) – ruakh 2012-03-17 14:42:59

+0

對於這個問題 - 構建這個大小並沒有什麼意義'$ words'正則表達式。你的'foreach($ blacklist as $ zeile)'-loop應該執行你需要的比較,回顯'$ bannedmsg'並且如果它檢測到匹配就死掉。 – ruakh 2012-03-17 14:47:53

回答

1

它在我看來像你正在產生錯誤的正則表達式。在這種情況下最好的做法是打開你的程序,看看每一步的輸入和輸出。舉例來說,如果foreach循環不執行(?爲什麼會發生這種情況),你的正則表達式最終會看起來像這樣:

/.*.*/ 

該正則表達式將匹配任何輸入。儘管找到了這個文件,但是,你可能還沒有得到你真正想要的東西。在這種情況下,你的正則表達式可能最終看起來像這樣:

/.*url1.com|url2.com|url3.com.*/ 

這不是你正在尋找的變化。它會匹配所有如下:

  1. url1.com
  2. whitelistedurl1.com
  3. 爲url1命令
  4. url3.com.google.com

它將匹配subdomain.url2.com。一套嚴格的unit tests對於像這樣的程序會非常有幫助。

最終,您可能希望教區人員指定您的替換開始和停止的位置(解決url2.com問題),以避免關於正則表達式的黑名單內容(要排除(3)),請檢查字符串的結尾(排除(4))和開始處的可選點(排除(2))。像這樣的:

/.*\.?(url1\.com|url2\.com|url3\.com)$/ 

這只是一個猜測,但不知道你正在處理的格式。最好的方法是再次對每個組件進行徹底的測試,並且至少進行基本的錯誤檢查。

相關問題