2012-01-17 57 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'); 
}