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