← Назад к вопросам

Расскажите о регулярных выражениях в 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]

Оптимизация и лучшие практики

  1. Используйте предкомпилированные паттерны с модификатором S для скорости:
$pattern = '/^[a-z0-9]+$/S'; // Флаг S оптимизирует повторное использование
  1. Избегайте жадных квантификаторов, когда возможно:
// Плохо (жадный режим):
preg_match('/<div>.*<\/div>/', $html);

// Лучше (ленивый режим):
preg_match('/<div>.*?<\/div>/', $html);
  1. Именованные группы улучшают читаемость:
$url = "https://example.com/page";
preg_match('/^(?<protocol>https?)://(?<domain>[^/]+)(?<path>\/.*)?$/', $url, $matches);
echo $matches['domain']; // "example.com"
  1. Кэшируйте регулярные выражения при многократном использовании:
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 остаются незаменимым инструментом для сложных текстовых операций, но требуют внимательного тестирования и понимания их внутренней механики для эффективного и безопасного использования.