将数组值与URL字符串匹配

时间:2011-04-13 00:03:37

标签: php arrays

我有一个数组:

$blacklist = array("asdf.com", "fun.com", "url.com");

我有一个输入字符串:

$input = "http://asdf.com/asdf/1234/";

我正在尝试查看string $ input是否与$ blacklist中的任何值匹配。

我如何做到这一点?

5 个答案:

答案 0 :(得分:3)

对于parse_url()来说,这听起来很不错:

<?php
    $blacklist = array("asdf.com", "fun.com", "url.com");
    $input = "http://asdf.com/asdf/1234/";

    $url = parse_url($input);

    echo (in_array($url['host'], $blacklist) ? '(FAIL)' : '(PASS)') . $url ['host'];
?>

<强>输出:

(FAIL)asdf.com 

答案 1 :(得分:1)

可能有一种方式(但我没有衡量绩效):

$san = preg_replace($blacklist, '', $input);

if($san !== $input) {
    //contained something from the blacklist
}

如果输入中不包含后备列表中的任何字符串,则字符串将保持不变。

另一个,可能更适合,绝对更有效的方法可以是extract the host part from the input并将黑名单创建为关联数组:

$blacklist = array(
      "asdf.com" => true,
      "fun.com" => true, 
      "url.com" => true
);

然后用O(1)进行测试:

if($blacklist[$host]) {
    //contained something from the blacklist
}

答案 2 :(得分:1)

使用foreach可能是您尝试实现的最佳解决方案。

$blacklist = array("/asdf\.com/", "/fun\.com/", "/url\.com/");

foreach($blacklist as $bl) {
  if (preg_match($bl, $input)){return true;}
}

答案 3 :(得分:0)

in_array是没用的,因为它会搜索确切的字符串。

你必须循环遍历数组并搜索它

foreach($str in $blacklist)
{
   if( stristr($input, $str ) )
    {
         //found
    }
}

答案 4 :(得分:0)

此代码应该有效:

$blacklist = array("asdf.com", "fun.com", "url.com");
$input = "http://asdf.com/asdf/1234/";
if (in_array(parse_url($input,PHP_URL_HOST),$blacklist))
  {
  // The website is in the blacklist.
  }