Активный
- Тема Автор
- #1
Полное руководство по работе с регулярными выражениями в PHP, включая синтаксис, функции и практические примеры.
Основные функции для работы с регулярными выражениями
В PHP есть основные функции для работы с регулярными выражениями:
- preg_match() - поиск первого совпадения
- preg_match_all() - поиск всех совпадений
- preg_replace() - замена совпадений
- preg_split() - разделение строки по шаблону
preg_match - поиск первого совпадения
preg_match_all - поиск всех совпадений
preg_replace - замена совпадений
preg_split - разделение строки
Основные метасимволы
Классы символов
Группы и захват
Проверка email адреса
Проверка телефона
Извлечение URL из текста
Очистка HTML тегов
Поиск и замена с обратными ссылками
Валидация пароля
Извлечение хештегов
Форматирование номера телефона
Модификаторы регулярных выражений
Экранирование специальных символов
Практический пример: парсинг логов
Регулярные выражения - мощный инструмент для работы с текстом в 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. Освоив их, вы сможете эффективно обрабатывать, валидировать и извлекать данные из строк.