2012-01-17 60 views
0

我以爲我有這個想法,但我遇到了一個問題。我在我的應用程序中創建了一個URL黑名單。我需要阻止一系列域中的所有子域,目錄等。下面是該陣列我有:黑名單和preg_match

$blacklist = array(
'/\.google\./', 
'/\.microsoft\./', 
); 

這裏就是我檢查:

$host = parse_url($url, PHP_URL_HOST); 
    $blackList = $GLOBALS['blacklist']; 
    foreach($blackList as $stop) { 
     if (preg_match($host === $stop)) { 
      die('blacklisted'); 
      } 
     } 

當我運行它,它並不如預期死亡。

+0

**可能有適當的時間使用'$ GLOBALS',但我還沒有遇到它**。更多請參閱[PHP中的全局變量是否被認爲是不好的做法?如果是這樣,爲什麼?](http://stackoverflow.com/questions/1557787/are-global-variables-in-php-considered-bad-practice-if-so-why) – rdlowrey 2012-01-17 07:35:10

回答

2

你的foreach循環應該是這樣的:

foreach($blacklist as $stop) { 
     if (preg_match($stop, $host)) { 
      die("blacklisted\n"); 
     } 
} 

你有2個問題:

  1. 數組變量命名爲blacklist但你在foreach循環使用blackList
  2. preg_match被錯誤地使用,它需要至少2個參數,如在我的答案。
+0

我剛剛改變它,它仍然不行。 – 2012-01-17 07:45:19

+0

看到它在這裏工作:http://ideone.com/fdmTo並使用'var_dump($ url);'打印您的變量'$ url'進行調查。 – anubhava 2012-01-17 08:03:53

+0

感謝您的幫助!你發佈的內容看起來不錯。我做了一個'print_r($ blackList)',它返回一個空數組。我想這是我的問題。 – 2012-01-17 08:20:12

0

您正在使用preg_match錯誤!

$host = parse_url($url, PHP_URL_HOST); 

foreach ($blacklist as $pattern){ 
    $matches = array(); 
    preg_match($pattern, $host, $matches); 
    if (count($matches)) die('blacklisted'); 
}