← Назад к вопросам
Расскажите о регулярных выражениях в PHP. Какие функции используете?
1.3 Junior🔥 121 комментариев
#PHP Core
Комментарии (1)
🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Регулярные выражения в PHP: полный обзор
Регулярные выражения (regex) в PHP — мощный инструмент для поиска, проверки и манипуляции текстом по заданным шаблонам. PHP поддерживает два основных синтаксиса: PCRE (Perl Compatible Regular Expressions) и POSIX Extended (устаревший с PHP 7.3). В современной практике используется исключительно PCRE.
Ключевые функции для работы с регулярными выражениями
1. Функции для проверки совпадений
// preg_match() - проверяет, соответствует ли строка шаблону
$email = "user@example.com";
if (preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $email)) {
echo "Валидный email";
}
// preg_match_all() - находит все совпадения в строке
$text = "Цены: $100, $200 и $300";
preg_match_all('/\$\d+/', $text, $matches);
print_r($matches[0]); // ['$100', '$200', '$300']
2. Функции для замены текста
// preg_replace() - заменяет совпадения
$text = "Сегодня 2024-12-25";
$result = preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$3.$2.$1', $text);
echo $result; // "Сегодня 25.12.2024"
// preg_replace_callback() - замена с использованием callback-функции
$text = "Температура: 25C и 30C";
$result = preg_replace_callback(
'/(\d+)C/',
function($matches) {
return ($matches[1] * 9/5 + 32) . 'F';
},
$text
);
3. Функции для разделения строк
// preg_split() - разделяет строку по регулярному выражению
$csv = "яблоки, груши; бананы | апельсины";
$parts = preg_split('/[,;|]\s*/', $csv);
print_r($parts); // ['яблоки', 'груши', 'бананы', 'апельсины']
4. Дополнительные полезные функции
// preg_quote() - экранирует спецсимволы в строке
$search = "file.txt";
$pattern = '/' . preg_quote($search, '/') . '/';
// preg_filter() - аналогична preg_replace, но возвращает только измененные элементы
// preg_grep() - фильтрует массив по регулярному выражению
Практические примеры использования
Валидация данных
function validatePhone($phone) {
// Российский номер: +7(XXX)XXX-XX-XX или 8XXX-XXX-XX-XX
return preg_match('/^(\+7|8)[\s\-]?\(?\d{3}\)?[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}$/', $phone);
}
Парсинг сложных структур
$html = '<div class="price">1000 руб.</div><div class="price">2000 руб.</div>';
preg_match_all('/<div class="price">(\d+)\s*руб\.<\/div>/', $html, $matches);
$prices = array_map('intval', $matches[1]); // [1000, 2000]
Оптимизация и лучшие практики
- Используйте предкомпилированные паттерны с модификатором
Sдля скорости:
$pattern = '/^[a-z0-9]+$/S'; // Флаг S оптимизирует повторное использование
- Избегайте жадных квантификаторов, когда возможно:
// Плохо (жадный режим):
preg_match('/<div>.*<\/div>/', $html);
// Лучше (ленивый режим):
preg_match('/<div>.*?<\/div>/', $html);
- Именованные группы улучшают читаемость:
$url = "https://example.com/page";
preg_match('/^(?<protocol>https?)://(?<domain>[^/]+)(?<path>\/.*)?$/', $url, $matches);
echo $matches['domain']; // "example.com"
- Кэшируйте регулярные выражения при многократном использовании:
class Validator {
private static $emailPattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
public static function validateEmail($email) {
return preg_match(self::$emailPattern, $email);
}
}
Производительность и безопасность
- Избегайте катастрофического возврата (catastrophic backtracking) в сложных выражениях
- Используйте ограничивающие символы (
^и$) для точных проверок - Для простых проверок строк иногда эффективнее использовать обычные строковые функции (
strpos(),substr()) - Всегда проверяйте входные данные перед применением regex
Современные альтернативы
Хотя регулярные выражения мощны, иногда лучше использовать:
- Фильтры PHP (
filter_var()для email, URL) - Специализированные парсеры (DOMDocument для HTML, SimpleXML для XML)
- Строковые функции для простых операций
Регулярные выражения в PHP остаются незаменимым инструментом для сложных текстовых операций, но требуют внимательного тестирования и понимания их внутренней механики для эффективного и безопасного использования.