Регулярные выражения в PHP

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Полное руководство по работе с регулярными выражениями в PHP, включая синтаксис, функции и практические примеры.

Основные функции для работы с регулярными выражениями

В PHP есть основные функции для работы с регулярными выражениями:
- preg_match() - поиск первого совпадения
- preg_match_all() - поиск всех совпадений
- preg_replace() - замена совпадений
- preg_split() - разделение строки по шаблону

preg_match - поиск первого совпадения

Код:
<?php
$text = "Мой email: user@example.com";
$pattern = "/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/";

if (preg_match($pattern, $text, $matches)) {
    echo "Email найден: " . $matches[0];
} else {
    echo "Email не найден";
}
?>

preg_match_all - поиск всех совпадений

Код:
<?php
$text = "Контакты: user1@example.com, user2@test.com, user3@mail.com";
$pattern = "/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/";

if (preg_match_all($pattern, $text, $matches)) {
    echo "Найдено email адресов: " . count($matches[0]) . "\n";
    foreach ($matches[0] as $email) {
        echo $email . "\n";
    }
}
?>

preg_replace - замена совпадений

Код:
<?php
$text = "Мой телефон: 8-999-123-45-67";
$pattern = "/8-(\d{3})-(\d{3})-(\d{2})-(\d{2})/";
$replacement = "+7 ($1) $2-$3-$4";

$result = preg_replace($pattern, $replacement, $text);
echo $result; // Мой телефон: +7 (999) 123-45-67
?>

preg_split - разделение строки

Код:
<?php
$text = "apple,banana,orange,grape";
$pattern = "/,/";
$parts = preg_split($pattern, $text);

foreach ($parts as $part) {
    echo $part . "\n";
}
?>

Основные метасимволы

Код:
<?php
// . - любой символ кроме новой строки
$pattern = "/a.b/"; // совпадает с "aab", "acb", "a1b"

// ^ - начало строки
$pattern = "/^Hello/"; // совпадает с "Hello world", но не с "Say Hello"

// $ - конец строки
$pattern = "/world$/"; // совпадает с "Hello world", но не с "world peace"

// * - ноль или более повторений
$pattern = "/ab*/"; // совпадает с "a", "ab", "abb", "abbb"

// + - одно или более повторений
$pattern = "/ab+/"; // совпадает с "ab", "abb", "abbb", но не с "a"

// ? - ноль или одно повторение
$pattern = "/ab?/"; // совпадает с "a", "ab"

// {n} - ровно n повторений
$pattern = "/a{3}/"; // совпадает с "aaa"

// {n,} - n или более повторений
$pattern = "/a{3,}/"; // совпадает с "aaa", "aaaa", "aaaaa"

// {n,m} - от n до m повторений
$pattern = "/a{2,4}/"; // совпадает с "aa", "aaa", "aaaa"
?>

Классы символов

Код:
<?php
// [abc] - любой из символов a, b или c
$pattern = "/[abc]/"; // совпадает с "a", "b", "c"

// [a-z] - любой символ от a до z
$pattern = "/[a-z]/"; // совпадает с любой строчной буквой

// [A-Z] - любой символ от A до Z
$pattern = "/[A-Z]/"; // совпадает с любой заглавной буквой

// [0-9] - любая цифра
$pattern = "/[0-9]/"; // совпадает с любой цифрой

// [^abc] - любой символ кроме a, b или c
$pattern = "/[^abc]/"; // совпадает с любым символом кроме a, b, c

// \d - любая цифра (эквивалентно [0-9])
$pattern = "/\d/";

// \D - любой символ кроме цифры
$pattern = "/\D/";

// \w - любой буквенно-цифровой символ или подчеркивание
$pattern = "/\w/";

// \W - любой символ кроме буквенно-цифрового
$pattern = "/\W/";

// \s - любой пробельный символ
$pattern = "/\s/";

// \S - любой символ кроме пробельного
$pattern = "/\S/";
?>

Группы и захват

Код:
<?php
$text = "Иван Иванов, Петр Петров, Сидор Сидоров";
$pattern = "/(\w+)\s+(\w+)/";

if (preg_match_all($pattern, $text, $matches)) {
    for ($i = 0; $i < count($matches[0]); $i++) {
        echo "Полное совпадение: " . $matches[0][$i] . "\n";
        echo "Имя: " . $matches[1][$i] . "\n";
        echo "Фамилия: " . $matches[2][$i] . "\n";
        echo "---\n";
    }
}
?>

Проверка email адреса

Код:
<?php
function validateEmail($email) {
    $pattern = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/";
    return preg_match($pattern, $email);
}

$emails = [
    "user@example.com",
    "test.email@domain.co.uk",
    "invalid.email",
    "user@domain",
    "user@domain."
];

foreach ($emails as $email) {
    if (validateEmail($email)) {
        echo "$email - валидный\n";
    } else {
        echo "$email - невалидный\n";
    }
}
?>

Проверка телефона

Код:
<?php
function validatePhone($phone) {
    // Поддержка форматов: +7 (999) 123-45-67, 8-999-123-45-67, 89991234567
    $pattern = "/^(\+7|8)[\s\-]?\(?(\d{3})\)?[\s\-]?(\d{3})[\s\-]?(\d{2})[\s\-]?(\d{2})$/";
    return preg_match($pattern, $phone);
}

$phones = [
    "+7 (999) 123-45-67",
    "8-999-123-45-67",
    "89991234567",
    "8(999)123-45-67",
    "123-45-67"
];

foreach ($phones as $phone) {
    if (validatePhone($phone)) {
        echo "$phone - валидный\n";
    } else {
        echo "$phone - невалидный\n";
    }
}
?>

Извлечение URL из текста

Код:
<?php
$text = "Посетите наш сайт https://example.com и блог http://blog.example.com/posts";
$pattern = "/https?:\/\/[^\s]+/";

if (preg_match_all($pattern, $text, $matches)) {
    echo "Найдено URL: " . count($matches[0]) . "\n";
    foreach ($matches[0] as $url) {
        echo $url . "\n";
    }
}
?>

Очистка HTML тегов

Код:
<?php
function stripHtmlTags($text) {
    $pattern = "/<[^>]*>/";
    return preg_replace($pattern, "", $text);
}

$html = "<p>Это <b>жирный</b> текст с <a href='#'>ссылкой</a></p>";
$clean = stripHtmlTags($html);
echo $clean; // Это жирный текст со ссылкой
?>

Поиск и замена с обратными ссылками

Код:
<?php
$text = "Дата: 2024-01-15";
$pattern = "/(\d{4})-(\d{2})-(\d{2})/";
$replacement = "$3.$2.$1"; // Меняем формат на DD.MM.YYYY

$result = preg_replace($pattern, $replacement, $text);
echo $result; // Дата: 15.01.2024
?>

Валидация пароля

Код:
<?php
function validatePassword($password) {
    // Пароль должен содержать минимум 8 символов,
    // хотя бы одну заглавную букву, одну строчную и одну цифру
    $pattern = "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/";
    return preg_match($pattern, $password);
}

$passwords = [
    "Password123",
    "weak",
    "STRONG123",
    "NoNumbers",
    "MyP@ssw0rd"
];

foreach ($passwords as $password) {
    if (validatePassword($password)) {
        echo "$password - валидный\n";
    } else {
        echo "$password - невалидный\n";
    }
}
?>

Извлечение хештегов

Код:
<?php
$text = "Это #крутой пост с #хештегами и #тегами";
$pattern = "/#(\w+)/";

if (preg_match_all($pattern, $text, $matches)) {
    echo "Найдено хештегов: " . count($matches[1]) . "\n";
    foreach ($matches[1] as $hashtag) {
        echo "#" . $hashtag . "\n";
    }
}
?>

Форматирование номера телефона

Код:
<?php
function formatPhone($phone) {
    // Удаляем все нецифровые символы
    $phone = preg_replace("/\D/", "", $phone);
    
    // Форматируем в формат +7 (999) 123-45-67
    if (strlen($phone) == 11 && $phone[0] == '8') {
        $phone = '7' . substr($phone, 1);
    }
    
    if (strlen($phone) == 11 && $phone[0] == '7') {
        $pattern = "/(\d)(\d{3})(\d{3})(\d{2})(\d{2})/";
        $replacement = "+$1 ($2) $3-$4-$5";
        return preg_replace($pattern, $replacement, $phone);
    }
    
    return $phone;
}

$phones = ["89991234567", "79991234567", "8-999-123-45-67"];
foreach ($phones as $phone) {
    echo formatPhone($phone) . "\n";
}
?>

Модификаторы регулярных выражений

Код:
<?php
// i - регистронезависимый поиск
$pattern = "/hello/i"; // совпадает с "Hello", "HELLO", "hello"

// m - многострочный режим (^ и $ работают для каждой строки)
$pattern = "/^start/m"; // совпадает с началом каждой строки

// s - точка совпадает с символом новой строки
$pattern = "/a.b/s"; // точка совпадает с любым символом включая \n

// u - UTF-8 режим
$pattern = "/[а-яё]/u"; // работа с кириллицей

// x - игнорирование пробелов в шаблоне
$pattern = "/
    \d{4}  # год
    -      # дефис
    \d{2}  # месяц
    -      # дефис
    \d{2}  # день
/x";
?>

Экранирование специальных символов

Код:
<?php
function escapeRegex($string) {
    return preg_quote($string, '/');
}

$search = "file.txt";
$text = "Имя файла: file.txt";
$pattern = "/" . escapeRegex($search) . "/";

if (preg_match($pattern, $text)) {
    echo "Найдено";
}
?>

Практический пример: парсинг логов

Код:
<?php
$log = "
[2024-01-15 10:30:15] ERROR: Database connection failed
[2024-01-15 10:30:20] INFO: User logged in: user123
[2024-01-15 10:31:00] WARNING: High memory usage: 85%
";

$pattern = "/\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\] (\w+): (.+)/";

if (preg_match_all($pattern, $log, $matches, PREG_SET_ORDER)) {
    foreach ($matches as $match) {
        echo "Дата: " . $match[1] . "\n";
        echo "Уровень: " . $match[2] . "\n";
        echo "Сообщение: " . $match[3] . "\n";
        echo "---\n";
    }
}
?>

Регулярные выражения - мощный инструмент для работы с текстом в PHP. Освоив их, вы сможете эффективно обрабатывать, валидировать и извлекать данные из строк.
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху