PHP 7.1.20 Released

preg_grep

(PHP 4, PHP 5, PHP 7)

preg_grepDevuelve entradas de matriz que coinciden con el patrón

Descripción

array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )

Devuelve la matriz consistente en los elementos de la matriz input que coinciden con pattern.

Parámetros

pattern

El patrón de búsqueda, como cadena.

input

La matriz de entrada.

flags

Si se establece a PREG_GREP_INVERT, esta función devuelve los elementos de la matriz de entrada que no coinciden con pattern.

Valores devueltos

Devuelve una matriz indexada usando las claves de la matriz input.

Ejemplos

Ejemplo #1 Ejemplo de preg_grep()

<?php
// devuelve todos los elementos de la matriz
// que contienen números de coma (punto) flotante
$matriz_fl preg_grep("/^(\d+)?\.\d+$/"$matriz);
?>

Ver también

add a note add a note

User Contributed Notes 6 notes

up
51
Daniel Klein
5 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
27
keithbluhm at gmail dot com
8 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
2
amolocaleb at gmail dot com
28 days 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
-1
Anonymous
25 days ago
- Add `filterKeys()`, because now only `filter()` (by values) exists.
- Add `anchored()` method (or other way) to use anchored patterns.
- Add a way to replace multiple strings with multiple replacements with one call to `preg_replace()`.
- Except from `filter()`/`filterKeys()`, add `except()`/`exceptKeys()` to filter out entries that match.
up
-13
Timo Klemm
1 year 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 ) );
}
?>
up
-107
vickyssj7 at gmail dot com
3 years ago
A very simple example to match multiple "."(dot) in an array value:-

<?php

     $array
= array("23.32","22","12.009","23.43.43");
    
print_r(preg_grep("/^(\d+)?\.\d+\.\d+$/",$array));

?>
To Top