3 回答

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊
有多種方法,您可以使用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貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
通常,我拒絕回答不包括編碼嘗試的問(wèn)題,但我不得不在這種情況下插話,因?yàn)橐呀?jīng)提供了次優(yōu)/不正確的建議,我想幫助未來(lái)的研究人員。
應(yīng)避免正則表達(dá)式,除非它提供了寶貴的優(yōu)勢(shì)——這就是其中之一。我的代碼片段只需要兩次函數(shù)調(diào)用,而不是 2n+1 次函數(shù)調(diào)用。
使用在正則表達(dá)式中表示“OR”的管道內(nèi)爆列入白名單的擴(kuò)展值。將管道分隔的字符串括在括號(hào)中以包含邏輯,在末尾寫入 a$
來(lái)要求擴(kuò)展值僅在字符串末尾匹配。使用i
模式修飾符使整個(gè)模式不區(qū)分大小寫。由于您的數(shù)組值僅包含字母字符,因此無(wú)需調(diào)用preg_quote()
來(lái)提供轉(zhuǎn)義斜杠。
代碼:(演示)
$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',
)
如果沒(méi)有括號(hào),“字符串結(jié)尾”$
將僅適用于管道分隔字符串中的最終擴(kuò)展名,并使模式不正確。
如果您不需要白名單數(shù)組是動(dòng)態(tài)的,您可以將正則表達(dá)式硬編碼為:
/jpe?g$/i
如果您通過(guò)目錄掃描或glob()
調(diào)用生成文件的輸入數(shù)組,那么您應(yīng)該使用glob()
的過(guò)濾功能。檢查 php 手冊(cè)。
要僅檢查任何文件是否具有最佳性能o
(小 o)的無(wú)效擴(kuò)展名,請(qǐng)使用foreach()
帶有條件的經(jīng)典循環(huán)break
。
代碼:(演示)
$hasInvalidFile = false;
foreach ($files as $file) {
? ? if (!in_array(pathinfo($file, PATHINFO_EXTENSION), $allowed_types)) {
? ? ? ? $hasInvalidFile = true;
? ? ? ? break;
? ? }
}
var_export($hasInvalidFile);

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
這將連接$allowed_typesOR 運(yùn)算符|并檢查擴(kuò)展名并返回不匹配的數(shù)組:
if(preg_grep('/'.implode('|', $allowed_types).'$/i', $array, PREG_GREP_INVERT)) {
// disallowed file types
}
在您的示例中,它將返回那些不匹配的內(nèi)容,jpg|jpeg$這意味著:
匹配字符串末尾的jpgORjpeg$
i結(jié)束后的字母/是大寫還是小寫(i如果需要,可以刪除)
如果您確實(shí)想知道哪些不匹配,那么:
if($bad = preg_grep('/'.implode('|', $allowed_types).'$/i', $array, PREG_GREP_INVERT)) {
print_r($bad);
}
然后$bad將包含不匹配的條目。
- 3 回答
- 0 關(guān)注
- 124 瀏覽
添加回答
舉報(bào)