Php 检查是否存在';数组元素中的任何禁止扩展

Php 检查是否存在';数组元素中的任何禁止扩展,php,arrays,Php,Arrays,我想检查数组元素中是否有任何禁止的扩展。怎么做 $allowed_types = array('jpg', 'jpeg'); 有多种方法,您可以使用pathinfo()例如: $allowed_types = array('jpg', 'jpeg'); $files = [ "C:/xampp/htdocs/blog/media/images/1597335125_1.jpg", "C:/xampp/htdocs/blog/media/images/

我想检查数组元素中是否有任何禁止的扩展。怎么做

$allowed_types = array('jpg', 'jpeg');

有多种方法,您可以使用
pathinfo()
例如:

$allowed_types = array('jpg', 'jpeg');

$files = [
   "C:/xampp/htdocs/blog/media/images/1597335125_1.jpg",
   "C:/xampp/htdocs/blog/media/images/1597335125_2.jpg",
   "C:/xampp/htdocs/blog/media/images/1597335125_3.jpg",
   "C:/xampp/htdocs/blog/media/images/1597335125_4.jpg",
   "C:/xampp/htdocs/blog/media/images/1597335125_5.png",
];

$not_allowed_files = array_filter($files, function($var) use ($allowed_types) {
    $path_info = pathinfo($var);
    return !in_array($path_info['extension'], $allowed_types);
});

(未测试)

这将在OR
操作符上加入
$allowed_type
,检查扩展名并返回不匹配的扩展名数组:

if(preg_grep('/'.implode('|', $allowed_types).'$/i', $array, PREG_GREP_INVERT)) {
    // disallowed file types
}
在您的示例中,它将返回那些不匹配的
jpg | jpeg$
,这意味着:

  • 在字符串的
    $
    末尾匹配
    jpg
    jpeg
  • 关闭
    /
    后的
    i
    用于大写或小写(如果需要,请删除
    i
如果您确实想知道哪些不匹配,那么:

if($bad = preg_grep('/'.implode('|', $allowed_types).'$/i', $array, PREG_GREP_INVERT)) {
    print_r($bad);
}

然后,
$bad
将包含不匹配的条目。

通常我拒绝回答不包括编码尝试的问题,但我不得不插话回答这个问题,因为已经提供了次优/不正确的建议,我想帮助未来的研究人员

应该避免使用正则表达式,除非它提供了有价值的优势——这就是其中之一。我的代码段只需要两个函数调用,而不是2n+1个函数调用

使用在正则表达式中表示“或”的管道内爆白名单扩展值。将以管道分隔的字符串括在括号中以包含逻辑,并在末尾写入一个
$
,以要求扩展值仅在字符串末尾匹配。使用
i
pattern修饰符使整个模式不区分大小写。因为数组值只有字母字符,所以不需要调用
preg_quote()
来提供转义斜杠

代码:()

输出:

array (
  1 => 'C:/xampp/htdocs/blog/media/images/jpeg_2.gif',
  4 => 'C:/xampp/htdocs/blog/media/images/jpg_5.png',
)
这个答案很类似于,但他的答案中的缺陷在于缺少括号。如果没有括号,“字符串结尾”
$
将仅应用于管道分隔字符串中的最后一个扩展名,并导致模式不正确

如果不需要白名单数组是动态的,可以将正则表达式硬编码为:

/jpe?g$/i
如果您是通过目录扫描或
glob()
调用生成文件的输入数组,那么您应该使用
glob()
的过滤功能。查看php手册


要仅检查是否有任何文件的扩展名无效且性能最好的
o
(小o),请使用经典的
foreach()
循环和有条件的
break

代码:()


不,因为我不知道如何在所有数组元素中检查它。@测试这只是遍历所有数组元素的标准代码循环。您放弃了吗?这将检查任何元素中是否有允许的扩展名以外的其他扩展名?是,它返回一个数组,其中的元素具有不允许的扩展名,如果没有,则结果为emtpy。
array (
  1 => 'C:/xampp/htdocs/blog/media/images/jpeg_2.gif',
  4 => 'C:/xampp/htdocs/blog/media/images/jpg_5.png',
)
/jpe?g$/i
$hasInvalidFile = false;
foreach ($files as $file) {
    if (!in_array(pathinfo($file, PATHINFO_EXTENSION), $allowed_types)) {
        $hasInvalidFile = true;
        break;
    }
}
var_export($hasInvalidFile);