2012-03-17 15 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'を印刷してみましたか? (ところで、 '$ * 'の始めと終わりに'。*'を取り除くべきだと思う;それは不必要で誤解を招く) – ruakh

+0

そして、それについては、この大きな'$ words'正規表現です。あなたの 'foreach($ blacklist as $ zeile)' -loopはあなたが必要とする比較を行い、 '$ bannedmsg'をエコーし​​、マッチを検出した場合には死ぬでしょう。 – ruakh

答えて

1

間違った正規表現を生成しているように私には見えます。このような状況で最善のことは、プログラムを少し開き、各ステップで入力と出力を調べることです。例えば、そのforeachループは(?なぜそれが起こるだろう)を実行していない場合は、あなたの正規表現は、このように見ていることになります:regexで

/.*.*/ 

は、任意の入力にマッチします。しかし、ファイルが見つかったとしても、おそらくあなたが本当に望むものを得ることはできません。この場合、あなたの正規表現はおそらく次のようなものになります。

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

これはあなたが探している代替ではありません。

  1. url1.com
  2. whitelistedurl1.com
  3. URL1-コマンド
  4. url3.com.google.com

それはないは以下となります。これは、次のすべてに一致します一致subdomain.url2.comunit testsの厳密なセットは、このようなプログラムにとって本当に役に立ちます。

究極的には、パランは、あなたの変更がどこで開始され、停止するかを(url2.comの問題を解決するために)指示し、正規表現に関してブラックリストの内容を逃れるようにする(ルール3を排除する)文字列の終わり(排除する(4))、およびオプションのドットを先頭に(排除する(2))。このようなもの:

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

これは、あなたが扱っているフォーマットを知らなくても、まあまあです。最良のルートは、各コンポーネントの徹底的なテストと、少なくとも基本的なエラーチェックです。

関連する問題