开发者

Filter array of filenames against an array of banned words and an array of banned file extensions

I am using PHP and I have an array of user images that I need to filter. I need to do 2 different filters:

  1. Look in original array and see if each value contains a value in my "bad words" array
  2. Look and see if the value in the original array ends in one of "bad extensions" values

Images Array:

Array  
(  
    [0] => smiles.gif  
    [1] => kittens.jpg  开发者_Go百科
    [2] => biscuits.png  
    [3] => butthead.jpg  
)  

$bad_words = array('beavis','butthead','winehouse');  
$bad_extensions = array('.gif','.tiff');  

I would like it to return:

Array  
(  
    [0] => kittens.jpg  
    [1] => biscuits.png  
)


$array = array("smiles.gif", "kittens.jpg", "biscuits.png", "butthead.jpg");

$new_arr = array_filter($array, "filter");

function filter($element) {
    $bad_words = array('beavis','butthead','winehouse');  
    $bad_extensions = array('gif','tiff');

    list($name, $extension) = explode(".", $element);
    if(in_array($name, $bad_words))
        return;

    if(in_array($extension, $bad_extensions))
        return;

    return $element;
}


echo "<pre>";
print_r($new_arr);
echo "</pre>";

Outputs

Array
(
    [1] => kittens.jpg
    [2] => biscuits.png
)

I removed the . from your extensions tho

edit: added wicked fleas correction


Firstly, I'd remove the periods in your extension list. It will only make the code more difficult. If you've done this, the following (untested) code should work, or at least be a start

$cleanArray = [];

foreach($array as $value) {

    $extension = path_info($value, PATHINFO_EXTENSION);

    if (in_array($extension, $bad_extensions)) {
        continue;
    }

    foreach($bad_words as $word) {
        if (strstr($word, $value)) {
            continue 2;
        }
    }
    $cleanArray[] = $value;


}

$cleanArray should have the values you want.

Here are some handy references from the PHP online docs

  • http://php.net/manual/en/control-structures.continue.php
  • http://au.php.net/strstr
  • http://php.net/manual/en/function.in-array.php


You could use the array_filter function in PHP, just write a function that does the filtering you want then call

array_filter($array1, "custom_filter");


Because case-insensitive matching is a reasonable inclusion and because in_array() does not have a case-insensitive mode, I'd probably just generate a regex pattern from the two arrays and let the regex engine do the tedious filtration.

Code: (Demo)

$branches = implode(
    '|',
    array_merge(
        $bad_words,
        array_map(
            fn($v) => preg_quote($v, '/') . '$',
            $bad_extensions
        )
    )
);
// beavis|butthead|winehouse|\.gif$|\.tiff$
var_export(preg_grep("/$branches/i", $array, PREG_GREP_INVERT));

Output:

array (
  1 => 'kittens.jpg',
  2 => 'biscuits.png',
)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜