preg_grep

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

preg_grepRetourne un tableau avec les résultats de la recherche

Description

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

preg_grep() retourne un tableau qui contient les éléments de array qui satisfont le masque pattern.

Liste de paramètres

pattern

Le motif à chercher, sous la forme d'une chaîne de caractères.

array

Le tableau d'entrée.

flags

Si cette option vaut PREG_GREP_INVERT, cette fonction retourne les éléments du tableau input qui ne correspondent pas au motif pattern.

Valeurs de retour

Retourne un tableau indexé, en utilisant les clés du tableau array d'entrée, ou false si une erreur survient.

Erreurs / Exceptions

Si le masque regex passé ne compile pas à une regex valide, une E_WARNING est émise.

Exemples

Exemple #1 Exemple avec preg_grep()

<?php
// Recherche les nombres à virgule flottante dans le tableau
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
?>

Voir aussi

add a note

User Contributed Notes 3 notes

up
76
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
26
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
14
amolocaleb at gmail dot com
6 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
To Top