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 關注
- 127 瀏覽
添加回答
舉報