對陣列的鍵值而不是值執行比對的較短方法
<?php
function preg_grep_keys($pattern, $input, $flags = 0) {
return array_intersect_key($input, array_flip(preg_grep($pattern, array_keys($input), $flags)));
}
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
preg_grep — 傳回符合樣式的陣列項目
傳回使用 array
陣列中的鍵值作為索引的陣列,如果失敗則傳回 false
。
如果傳遞的正規表達式模式無法編譯成有效的正規表達式,則會發出 E_WARNING
警告。
範例 #1 preg_grep() 範例
<?php
// 傳回所有包含浮點數的陣列元素
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
?>
對陣列的鍵值而不是值執行比對的較短方法
<?php
function preg_grep_keys($pattern, $input, $flags = 0) {
return array_intersect_key($input, array_flip(preg_grep($pattern, array_keys($input), $flags)));
}
?>
對陣列的鍵值而不是值執行比對
<?php
函數 preg_grep_keys( $pattern, $input, $flags = 0 )
{
$keys = preg_grep( $pattern, array_keys( $input ), $flags );
$vals = array();
foreach ( $keys as $key )
{
$vals[$key] = $input[$key];
}
return $vals;
}
?>
這對大多數經驗豐富的開發者來說可能很明顯,但為了以防萬一,當使用 preg_grep 來檢查白名單項目時,必須非常小心地明確定義正規表達式邊界,否則它會失敗。
<?php
$whitelist = ["home","dashboard","profile","group"];
$possibleUserInputs = ["homd","hom","ashboard","settings","group"];
foreach($possibleUserInputs as $input)
{
if(preg_grep("/$input/i",$whitelist)
{
echo $input." 列入白名單";
}else{
echo $input." 有缺陷";
}
}
?>
結果如下:
homd 有缺陷
hom 列入白名單
ashboard 列入白名單
settings 有缺陷
group 列入白名單
我認為這是因為如果沒有明確定義邊界,preg_grep 會在整個陣列中查找任何子字串的實例,如果找到則返回 true。這不是我們想要的,因此必須定義邊界。
<?php
foreach($possibleUserInputs as $input)
{
if(preg_grep("/^$input$/i",$whitelist)
{
echo $input." 列入白名單";
}else{
echo $input." 有缺陷";
}
}
?>
結果如下:
homd 有缺陷
hom 有缺陷
ashboard 有缺陷
settings 有缺陷
group 列入白名單
使用 in_array() 也會得到後面的結果,但如果搜尋不區分大小寫(70% 的情況都是如此),則需要一些調整。