2012-03-17 89 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)$/ 

这只是一个猜测,但不知道你正在处理的格式。最好的方法是再次对每个组件进行彻底的测试,并且至少进行基本的错误检查。

相关问题