PHP 8.6.0 Beta 1 is available for testing

preg_grep

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

preg_grepВозвращает массив вхождений, которые соответствуют шаблону

Описание

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

Возвращает массив, состоящий из элементов входящего массива array, которые соответствуют заданному шаблону pattern.

Список параметров

pattern

Искомый шаблон в виде строки.

array

Входящий массив.

flags

В случае, если установлен в PREG_GREP_INVERT , функция preg_grep() возвращает те элементы массива, которые не соответствуют заданному шаблону pattern.

Возвращаемые значения

Возвращает массив, индексированный ключами из массива array или false , если возникла ошибка.

Ошибки

Если передали шаблон регулярного выражения, который не компилируется в допустимое регулярное выражение, выдаётся ошибка уровня E_WARNING .

Примеры

Пример #1 Пример использования preg_grep()

<?php
$array = [ "4", M_PI, "2.74", 42 ];
// Возвращает все элементы массива, содержащие числа с плавающей точкой
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
var_dump($fl_array);
?>

Смотрите также

Нашли ошибку?

ИнструкцияИсправлениеСообщение об ошибке
+Добавить

Примечания пользователей 3 notes

up
76
Daniel Klein
13 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
16 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
13
amolocaleb at gmail dot com
8 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
+Добавить

AltStyle によって変換されたページ (->オリジナル) /