为了账号安全,请及时绑定邮箱和手机立即绑定

检查数组元素中是否存在禁止扩展

检查数组元素中是否存在禁止扩展

PHP
长风秋雁 2023-10-01 17:06:02
我想检查数组元素中是否有任何禁止的扩展。怎么做?$allowed_types = array('jpg', 'jpeg');Array(   [0] => C:/xampp/htdocs/blog/media/images/1597335125_1.jpg   [1] => C:/xampp/htdocs/blog/media/images/1597335125_2.jpg   [2] => C:/xampp/htdocs/blog/media/images/1597335125_3.jpg   [3] => C:/xampp/htdocs/blog/media/images/1597335125_4.jpg   [4] => C:/xampp/htdocs/blog/media/images/1597335125_5.png)
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

有多种方法,您可以使用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);

});


查看完整回答
反对 回复 2023-10-01
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

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

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

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

代码:(演示

$allowed_types = ['jpg', 'jpeg'];


$files = [

   "C:/xampp/htdocs/blog/media/images/1597335125_1.jpg",

   "C:/xampp/htdocs/blog/media/images/jpeg_2.gif",

   "C:/xampp/htdocs/blog/media/images/1597335125_3.jpeg",

   "C:/xampp/htdocs/blog/media/images/1597335125_4.jpg",

   "C:/xampp/htdocs/blog/media/images/jpg_5.png",

];


if ($disallowed = preg_grep('/(' . implode('|', $allowed_types) . ')$/i', $files, PREG_GREP_INVERT)) {

    var_export($disallowed);

}

输出:


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

代码:(演示

$hasInvalidFile = false;

foreach ($files as $file) {

    if (!in_array(pathinfo($file, PATHINFO_EXTENSION), $allowed_types)) {

        $hasInvalidFile = true;

        break;

    }

}

var_export($hasInvalidFile);


查看完整回答
反对 回复 2023-10-01
?
繁星coding

TA贡献1797条经验 获得超4个赞


这将连接$allowed_typesOR 运算符|并检查扩展名并返回不匹配的数组:


if(preg_grep('/'.implode('|', $allowed_types).'$/i', $array, PREG_GREP_INVERT)) {

    // disallowed file types

}

在您的示例中,它将返回那些不匹配的内容,jpg|jpeg$这意味着:


匹配字符串末尾的jpgORjpeg$

i结束后的字母/是大写还是小写(i如果需要,可以删除)

如果您确实想知道哪些不匹配,那么:


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

    print_r($bad);

}

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


查看完整回答
反对 回复 2023-10-01
  • 3 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号