CakeFest 2024: The Official CakePHP Conference

preg_grep

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

preg_grepLiefert Array-Elemente, die auf ein Suchmuster passen

Beschreibung

preg_grep(string $pattern, array $array, int $flags = 0): array|false

Gibt ein Array zurück, das aus den Elementen des Arrays array besteht, die auf das angegebene Suchmuster pattern passen.

Parameter-Liste

pattern

Der Ausdruck, nach dem gesucht werden soll, als Zeichenkette

array

Das Eingabe-Array

flags

Falls auf PREG_GREP_INVERT gesetzt, gibt die Funktion die Elemente des Eingabe-Arrays zurück, die nicht auf das angegebene Suchmuster pattern passen.

Rückgabewerte

Gibt ein Array zurück, das mit den Schlüsseln des Arrays array indiziert ist. Bei einem Fehler wird false zurückgegeben.

Fehler/Exceptions

Wenn das übergebene Regex-Muster nicht zu einem gültigen Regex kompiliert werden kann, wird ein Fehler der Stufe E_WARNING ausgegeben.

Beispiele

Beispiel #1 preg_grep()-Beispiel

<?php
// gibt alle Array-Elemente zurück,
// die Gleitkommazahlen enthalten
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
?>

Siehe auch

add a note

User Contributed Notes 4 notes

up
73
Daniel Klein
11 years ago
A shorter way to run a match on the array's keys rather than the values:

<?php
function preg_grep_keys($pattern, $input, $flags = 0) {
return
array_intersect_key($input, array_flip(preg_grep($pattern, array_keys($input), $flags)));
}
?>
up
13
amolocaleb at gmail dot com
5 years ago
This may be obvious to most experienced developers,but just in case its not,when using preg_grep to check for whitelisted items ,one must be very careful to explicitly define the regex boundaries or it will fail
<?php
$whitelist
= ["home","dashboard","profile","group"];
$possibleUserInputs = ["homd","hom","ashboard","settings","group"];
foreach(
$possibleUserInputs as $input)
{
if(
preg_grep("/$input/i",$whitelist)
{
echo
$input." whitelisted";
}else{
echo
$input." flawed";
}

}
?>
This results in:

homd flawed
hom whitelisted
ashboard whitelisted
settings flawed
group whitelisted

I think this is because if boundaries are not explicitly defined,preg_grep looks for any instance of the substring in the whole array and returns true if found.This is not what we want,so boundaries must be defined.

<?php
foreach($possibleUserInputs as $input)
{
if(
preg_grep("/^$input$/i",$whitelist)
{
echo
$input." whitelisted";
}else{
echo
$input." flawed";
}

}
?>
this results in:
homd flawed
hom flawed
ashboard flawed
settings flawed
group whitelisted
in_array() will also give the latter results but will require few tweaks if say,the search is to be case insensitive,which is always the case 70% of the time
up
27
keithbluhm at gmail dot com
14 years ago
Run a match on the array's keys rather than the values:

<?php

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

?>
up
-42
Timo Klemm
7 years ago
An even shorter way to run a match on the array's keys rather than the values:

<?php
function preg_grep_keys($pattern, $input, $flags = 0) {
return
array_flip( preg_grep($pattern, array_flip($input), $flags ) );
}
?>
To Top