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:
- Look in original array and see if each value contains a value in my "bad words" array
- 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',
)
精彩评论