Preg grep: примеры (PHP)

Полный обзор функции preg_grep для поиска в массивах PHP
Раздел: Регулярные выражения
preg_grep(string $pattern, array $array, int $flags = 0): array|false
Описание функции preg_grep

Функция preg_grep() выполняет фильтрацию элементов массива с использованием регулярного выражения. Она просматривает массив и возвращает элементы, совпадающие с заданным шаблоном. Основная область применения – выборка данных из массивов по сложным текстовым шаблонам, когда простые строковые функции недостаточны.

Синтаксис функции: preg_grep(string $pattern, array $array, int $flags = 0): array|false.

Аргументы:

  • $pattern – строка, содержащая регулярное выражение (PCRE).
  • $array – входной массив для фильтрации.
  • $flags – опциональный флаг. Если установлен PREG_GREP_INVERT, функция возвращает элементы, которые не соответствуют шаблону.

Функция возвращает массив с сохранением исходных ключей или false в случае ошибки в регулярном выражении.

Базовые примеры использования
Простой поиск совпадений
$array = ['apple', 'banana', 'apricot', 'cherry', 'avocado'];
$result = preg_grep('/^ap/', $array);
print_r($result);
Array
(
    [0] => apple
    [2] => apricot
)
Использование флага PREG_GREP_INVERT
$array = ['test1.txt', 'test2.jpg', 'readme.txt', 'image.png'];
$result = preg_grep('/\.txt$/', $array, PREG_GREP_INVERT);
print_r($result);
Array
(
    [1] => test2.jpg
    [3] => image.png
)
Альтернативные функции в PHP

array_filter() с preg_match() – позволяет выполнить более сложную логику фильтрации, но требует написания callback-функции. Используется, когда нужны дополнительные условия помимо регулярного выражения.

$array = ['apple', 'banana', '123', 'apricot'];
$result = array_filter($array, fn($item) => preg_match('/^[a-z]+$/', $item));
print_r($result);
Array
(
    [0] => apple
    [1] => banana
    [3] => apricot
)

strpos() и другие строковые функции – подходят для простого поиска подстрок без сложных шаблонов. Работают быстрее регулярных выражений.

Типичные ошибки
Некорректное регулярное выражение
$result = preg_grep('/[invalid/', ['test']);
if ($result === false) {
    echo 'Ошибка в регулярном выражении';
}
Ошибка в регулярном выражении
Использование без проверки на false
$array = ['data'];
$filtered = preg_grep('/(/', $array); // Ошибка в шаблоне
foreach ($filtered as $item) { // Предупреждение, если false
    echo $item;
}
Warning: foreach() argument must be of type array|object, bool given
Ожидание переиндексации ключей

Функция сохраняет исходные ключи, что иногда приводит к неожиданным результатам.

$result = preg_grep('/^a/', [2 => 'apple', 5 => 'banana', 7 => 'apricot']);
print_r($result);
Array
(
    [2] => apple
    [7] => apricot
)
Изменения в PHP 8

В PHP 8.0 функция preg_grep() теперь выбрасывает исключение \ValueError, если переданное регулярное выражение недопустимо, вместо возврата false и генерации предупреждения. Это улучшает обработку ошибок.

// PHP 8
$result = preg_grep('/invalid regex/', ['test']);
ValueError: preg_grep(): Delimiter must not be alphanumeric, backslash, or NUL

В PHP 8.2 добавлена возможность передачи массива в качестве аргумента $pattern для использования нескольких шаблонов одновременно.

Расширенные примеры
Фильтрация по нескольким шаблонам (PHP 8.2+)
Пример php
$files = ['index.html', 'style.css', 'script.js', 'readme.md'];
$patterns = ['/\.html$/', '/\.css$/'];
$result = preg_grep($patterns, $files);
print_r($result);
Array
(
    [0] => index.html
    [1] => style.css
)
Поиск строк, содержащих числа
Пример php
$data = ['product1', 'product_two', 'item3', 'test', 'version5.2'];
$result = preg_grep('/\d/', $data);
print_r($result);
Array
(
    [0] => product1
    [2] => item3
    [4] => version5.2
)
Извлечение элементов с определенной структурой
Пример php
$emails = ['user@example.com', 'invalid.email', 'test@domain.org', 'no_at_symbol'];
$valid_emails = preg_grep('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $emails);
print_r($valid_emails);
Array
(
    [0] => user@example.com
    [2] => test@domain.org
)
Фильтрация ассоциативного массива по значениям
Пример php
$users = [
    'id101' => 'john_doe',
    'id102' => 'jane_smith',
    'id103' => 'bob123',
    'id104' => 'alice-jones'
];
$result = preg_grep('/^[a-z]+_[a-z]+$/i', $users);
print_r($result);
Array
(
    [id101] => john_doe
    [id102] => jane_smith
)
Использование с PREG_GREP_INVERT для исключения шаблонов
Пример php
$logs = ['error: disk full', 'warning: high memory', 'info: started', 'debug: connection'];
$without_debug = preg_grep('/^debug:/', $logs, PREG_GREP_INVERT);
print_r($without_debug);
Array
(
    [0] => error: disk full
    [1] => warning: high memory
    [2] => info: started
)
Аналоги в других языках

Preg grep в Javascript

Метод filter() массива с использованием RegExp.

const array = ['apple', 'banana', '123', 'apricot'];
const result = array.filter(item => /^[a-z]+$/.test(item));
console.log(result);
['apple', 'banana', 'apricot']

Preg grep в Python

Использование модуля re с фильтрацией списка.

import re
array = ['apple', 'banana', '123', 'apricot']
pattern = re.compile(r'^[a-z]+$')
result = list(filter(pattern.match, array))
print(result)
['apple', 'banana', 'apricot']

Preg grep в MySQL

Оператор REGEXP в условиях WHERE, но применяется к результатам запросов, а не к массивам.

SELECT * FROM products WHERE name REGEXP '^ap';

PHP preg_grep function comments

En
Preg grep Return array entries that match the pattern