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

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


$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

)


长风秋雁
浏览 99回答 3
3回答

慕村225694

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

潇潇雨雨

通常,我拒绝回答不包括编码尝试的问题,但我不得不在这种情况下插话,因为已经提供了次优/不正确的建议,我想帮助未来的研究人员。应避免正则表达式,除非它提供了宝贵的优势——这就是其中之一。我的代码片段只需要两次函数调用,而不是 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);

繁星coding

这将连接$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将包含不匹配的条目。
打开App,查看更多内容
随时随地看视频慕课网APP