3 回答

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);
});

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);

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将包含不匹配的条目。
- 3 回答
- 0 关注
- 98 浏览
添加回答
举报