我有一个名为blacklist.txt
的txt文件。我需要检查输入的$fullURL
或其任何子域是否在文件中,如果不是,请执行一些功能。我已经完成了这段代码,但它始终回应$bannedmsg
,我做错了什么?
$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 :(得分:1)
在我看来,你正在生成错误的正则表达式。在这种情况下,最好的办法是稍微打开你的程序,然后查看每一步的输入和输出。例如,如果那个foreach循环没有执行(为什么会这样?),你的正则表达式将最终看起来像这样:
/.*.*/
该正则表达式将匹配任何输入。即使找到文件,你可能仍然没有得到你真正想要的东西。在这种情况下,你的正则表达式可能最终看起来像:
/.*url1.com|url2.com|url3.com.*/
这不是你要找的替代品。它将匹配以下所有内容:
不匹配 subdomain.url2.com 。一套严格的unit tests对这样的程序非常有帮助。
最终,你可能希望parans决定你的交替开始和停止的位置(解决url2.com问题),逃避关于正则表达式的黑名单内容(排除(3)),检查结束字符串(排除(4)),以及开头的可选点(排除(2))。像这样:
/.*\.?(url1\.com|url2\.com|url3\.com)$/
但这只是猜测,不知道你正在处理的格式。同样,最好的方法是对每个组件进行全面测试,至少进行基本的错误检查。