如何在PHP中编写有效的黑名单过滤功能?

时间:2010-06-02 13:56:16

标签: php regex filter

所以,我有三个这样的数组:

 [items] => Array
            ( [0] => Array
                  ( 
                    [id] => someid
                    [title] => sometitle
                    [author] => someauthor
                    ...
                  )
              ...
             )

以及一个用逗号分隔的单词到黑名单的字符串:

  $blacklist = "some,words,to,blacklist";

现在我需要将这些单词与 id,title author 匹配,并相应地显示结果。

我在想这样一个函数:

  $pattern = '('.strtr($blacklist, ",", "|").')'; // should return (some|words|etc)

  foreach ($items as $item) {
          if ( !preg_match($pattern,$item['id']) || !preg_match($pattern,$item['title']) || !preg_match($pattern,$item['author']) ) 
               { 
                   // show item
               }
  }

我想知道这是否是过滤数组的最有效方法,或者我应该使用 strpos() filter_var 与FILTER_VALIDATE_REGEXP ...

请注意,每3个数组重复此功能。但是,每个数组不会包含超过50个项目。

1 个答案:

答案 0 :(得分:3)

你的不错。我通常会使用strpos来做这样的事情......



$items = filter($foo['items'], array('some','words','to','blacklist'));

function filter($items, $blacklist) {

    $filtered = array();

    foreach($items as $item) {
        foreach($item as $key => $value) {
            $pass = true;
            foreach($blacklist as $filter) {
                $pass = strpos($value, $filter) === false;
                if(!$pass) break;
            }
            if($pass) $filtered[] = clone($item); 
        }
    }

    return $filtered;
}

要添加更多复杂性,您可以通过空格标记您正在检查的字符串。然后代码将成为:


function filter($items, $blacklist) {

    $filtered = array();

    foreach($items as $item) {
        foreach($item as $key => $value) {
            $pass = true;
            foreach(explode(' ', $value) as $word) {
                $pass = !in_array($word, $blacklist);
                if(!$pass) break;
            }
            if($pass) $filtered[] = clone($item); 
        }
    }

    return $filtered;
}