PHP Conference Japan 2024

preg_grep

(PHP 4, PHP 5, PHP 7, PHP 8)

preg_grep傳回符合樣式的陣列項目

說明

preg_grep(字串 $pattern, 陣列 $array, 整數 $flags = 0): 陣列|false

傳回由 array 陣列中符合給定 pattern 的元素所組成的陣列。

參數

pattern

要搜尋的模式,以字串表示。

array

輸入陣列。

flags

如果設定為 PREG_GREP_INVERT,此函式會傳回輸入陣列中 *不* 符合給定 pattern 的元素。

傳回值

傳回使用 array 陣列中的鍵值作為索引的陣列,如果失敗則傳回 false

錯誤/例外

如果傳遞的正規表達式模式無法編譯成有效的正規表達式,則會發出 E_WARNING 警告。

範例

範例 #1 preg_grep() 範例

<?php
// 傳回所有包含浮點數的陣列元素
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
?>

參見

新增註解

使用者貢獻的註解 3 則註解

Daniel Klein
11 年前
對陣列的鍵值而不是值執行比對的較短方法

<?php
function preg_grep_keys($pattern, $input, $flags = 0) {
return
array_intersect_key($input, array_flip(preg_grep($pattern, array_keys($input), $flags)));
}
?>
keithbluhm at gmail dot com
14 年前
對陣列的鍵值而不是值執行比對

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

?>
amolocaleb at gmail dot com
6 年前
這對大多數經驗豐富的開發者來說可能很明顯,但為了以防萬一,當使用 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% 的情況都是如此),則需要一些調整。
To Top