Preg grep: примеры (PHP)
preg_grep(string $pattern, array $array, int $flags = 0): array|falseФункция 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
)$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
)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 'Ошибка в регулярном выражении';
}Ошибка в регулярном выражении
$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.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 для использования нескольких шаблонов одновременно.
$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
)$data = ['product1', 'product_two', 'item3', 'test', 'version5.2'];
$result = preg_grep('/\d/', $data);
print_r($result);Array
(
[0] => product1
[2] => item3
[4] => version5.2
)$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
)$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
)$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';