Регулярные выражения в PHP. Самое полное руководство.
Введение в регулярные выражения
Есть одна бородатая шутка: «если у вас есть проблема, и вы собираетесь решать ее с использованием регулярных выражений, то у вас теперь две проблемы». Регулярные выражения это очень мощный и гибкий инструмент, но как водится, такой серьезный инструмент имеет не очень дружелюбный вид, поэтому я не могу обойти эту тему стороной.
Регулярные выражения — это мощный инструмент для работы с текстом. Они позволяют искать, сопоставлять и изменять подстроки в строке на основе шаблонов. Используются для валидации данных, извлечения информации и замены текста.
Основные элементы регулярных выражений:
1️⃣ Символы — обычные символы для поиска.
2️⃣ Метасимволы — специальные символы с особым значением.
3️⃣ Анкоры (якори) — комбинации символов, представляющие шаблоны.
4️⃣ Операторы — для объединения символов и создания сложных условий поиска.
5️⃣ Модификаторы — для объединения символов и создания сложных условий поиска.
Операторы и модификаторы
🔑 Операторы:
1️⃣ | (вертикальная черта) — соответствует одному из нескольких выражений. Например, /a|b/ соответствует либо символу «a», либо символу «b».
2️⃣ [] (квадратные скобки) — соответствует любому символу внутри скобок. Например, /[abc]/ соответствует символам «a», «b» или «c».
3️⃣ () (круглые скобки) — создает группу символов, которую можно обрабатывать как единое целое. Например, /(ab)+/ соответствует «ab», «abab», «ababab» и т.д.
4️⃣ ? (вопросительный знак) — указывает, что предыдущий символ или группа может быть опциональным. Например, /ab?c/ соответствует «ac» и «abc».
5️⃣ * (звездочка) — указывает, что предыдущий символ или группа может повторяться ноль или более раз. Например, /ab*c/ соответствует «ac», «abc», «abbc», «abbbc» и т.д.
6️⃣ + (плюс) — указывает, что предыдущий символ или группа должны повторяться один или более раз. Например, /ab+c/ соответствует «abc», «abbc», «abbbc» и т.д.
7️⃣ . (точка) — соответствует любому символу, кроме символа новой строки. Например, /a.b/ соответствует «aab», «abb», «acb» и т.д.
🔑 Модификаторы:
1️⃣ i — делает регулярное выражение регистронезависимым. Например, /abc/i соответствует «ABC» или «AbC».
2️⃣ m — включает многострочный режим. Например, /^abc$/m соответствует «abc» в каждой строке текста.
3️⃣ s — включает однострочный режим. Например, /a.b/s соответствует «a\nb».
4️⃣ u — включает режим Unicode. Позволяет работать с символами Unicode.
5️⃣ x — игнорирует пробелы и комментарии внутри регулярного выражения. Позволяет более удобно форматировать выражение для читаемости.
🚀 Пример использования операторов и модификаторов:
Допустим, у нас есть текст, содержащий несколько адресов электронной почты. Мы хотим найти их с помощью регулярного выражения.
$text = "Электронная почта: info@example.com, support@example.com";
Spattern = "/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/i";
preg_match_all($pattern, $text, $matches);
echo "Найденные адреса электронной почты:";
foreach ($matches[0] as $email) {
echo $email; // выведет по очереди все email адреса из текста
}Квантификаторы
🔍 Квантификаторы используются для указания количества повторений предыдущего элемента в регулярном выражении.
📚Вот более подробное объяснение квантификаторов:
* (звездочка): соответствует предыдущему элементу ноль или более раз. Например, выражение /a*/ найдет пустую строку, «a», «aa», «aaa» и так далее.
+ (плюс): соответствует предыдущему элементу один или более раз. Например, выражение /a+/ найдет «a», «aa», «aaa» и так далее, но не найдет пустую строку.
? (вопросительный знак): соответствует предыдущему элементу ноль или один раз. Например, выражение /a?/ найдет пустую строку и «a».
{n}: указывает точное количество повторений предыдущего элемента. Например, выражение /a{3}/ найдет только «aaa».
{n,}: указывает, что предыдущий элемент должен повторяться не менее n раз. Например, выражение /a{2,}/ найдет «aa», «aaa», «aaaa» и так далее.
{n,m}: указывает диапазон количества повторений предыдущего элемента от n до m. Например, выражение /a{2,4}/ найдет «aa», «aaa» и «aaaa».
🌟 Пример кода:
В этом примере мы ищем все слова, состоящие из пяти букв, в предложении. Квантификатор {5} указывает, что предыдущий элемент (буква \w) должен повторяться ровно пять раз. Мы используем якорный символ \b для ограничения соответствия только отдельными словами. Результатом будет массив, содержащий все найденные слова.
$text = "The quick brown fox jumps over the lazy dog.";
Spattern = "/\b\w{5}\b/i";
preg_match_all($pattern, $text, $matches);
print_r($matches[0]);
// получаем следующее
/* Array
[0] => quick
[1] => brown
[2] => jumps
)*/Анкоры (якори)
🔗 Анкоры в регулярных выражениях используются для определения определенных позиций в тексте, а не самих символов. Они позволяют указать, что сопоставление должно произойти в определенной позиции строки.
Давайте рассмотрим анкоры подробнее:
1️⃣ ^ — символ начала строки. Этот якорь указывает на позицию перед первым символом строки. Например, регулярное выражение /^hello/ будет соответствовать строке, начинающейся с «hello».
2️⃣ $ — символ конца строки. Он указывает на позицию после последнего символа строки. Например, регулярное выражение /world$/ будет соответствовать строке, заканчивающейся на «world».
3️⃣ \b — граница слова. Она указывает на позицию между символами слова и не слова. Например, регулярное выражение /\bexample\b/ будет соответствовать слову «example» только если оно находится в отдельном слове.
4️⃣ \B — позиция, не являющаяся границей слова. Она находится между двумя символами слова или двумя символами не слова.
5️⃣ \A — начало строки. Этот якорь аналогичен символу начала строки ^, но не игнорирует многострочный режим. То есть он всегда указывает на начало текста.
6️⃣ \Z — конец строки или конец строки перед символом новой строки. Этот якорь аналогичен символу конца строки $, но также учитывает символ новой строки.
7️⃣ \z — конец строки. Этот якорь аналогичен символу конца строки $, но не игнорирует многострочный режим.
8️⃣ \G — точка сопоставления, с которой начинается следующее сопоставление. Этот якорь полезен при поиске нескольких совпадений в тексте.
🌟 Пример использования анкоров:
В этом примере мы используем анкор \b для указания границы слова. Регулярное выражение /\bexample\b/ соответствует слову «example» только если оно находится в отдельном слове.
$pattern = "/\bexample\b/"
$string1 = "This is an example";
$string2 = "Just an example";
#string3 = "Here's anotherexample";
echo preg_match($pattern, $string1); // Вывод: 1 (соответствует)
echo preg_match($pattern, $string2); // Вывод: 1 (соответствует)
echo preg_match($pattern, $string3); // Вывод: 0 (не соответствует)Лично для меня анкор \G оказался самым сложным для понимания, поэтому я остановлюсь на нем чуть подробнее и рассмотрю еще один пример:
// без якоря \G
$pattern = "/\d+/";
$string = "123456abc789def";
preg_match_all($pattern, $string, $matches);
print_r($matches);
// Array ( [0] => Array ( [0] => 123456 [1] => 789 ) )
// с якорем \G
$pattern = "/\G\d+/";
$string = "123456abc789def";
preg_match_all($pattern, $string, $matches);
print_r($matches);
// Array ( [0] => Array ( [0] => 123456 ) )В этом примере мы ищем все цифры в строке. Используя \G, мы просим регулярное выражение начать сопоставление с точки, с которой закончилось предыдущее совпадение.
Таким образом, якорь \G в PHP используется для определения позиции начала строки или позиции сразу после предыдущего успешного совпадения в регулярном выражении.
Классификаторы символов
🔍 Классификаторы символов — это специальные обозначения, которые используются в регулярных выражениях для сопоставления определенных категорий символов. Они позволяют удобно обращаться к группам символов без необходимости перечисления каждого символа отдельно.
📝 Распространенные классификаторы символов:
\d — сопоставляет любую цифру. Эквивалентно [0-9]. Например, \d будет соответствовать символам «0», «1», «2» и так далее.
\D — сопоставляет любой символ, который не является цифрой. Эквивалентно [^0-9]. Например, \D будет соответствовать символам «a», «b», «c» и так далее.
\w — сопоставляет любую букву, цифру или символ подчеркивания. Эквивалентно [a-zA-Z0-9_]. Например, \w будет соответствовать символам «a», «B», «9» и символу подчеркивания «_».
\W — сопоставляет любой символ, который не является буквой, цифрой или символом подчеркивания. Эквивалентно [^a-zA-Z0-9_]. Например, \W будет соответствовать символам «$», «%», «#», и т.д.
\s — сопоставляет любой пробельный символ, такой как пробел, табуляция, перевод строки и т.д. Например, \s будет соответствовать символам пробела, табуляции или новой строки.
\S — сопоставляет любой символ, который не является пробельным символом. Например, \S будет соответствовать символам букв, цифр, знаков пунктуации и т.д.
👉 Классификаторы символов помогают сократить и упростить регулярные выражения, делая их более читаемыми и компактными.
🌟Пример:
В этом примере мы ищем совпадение с шаблоном, состоящим из трех цифр, за которыми следует пробел, а затем три буквы. Строка «123 ABC» соответствует этому шаблону, поэтому будет выведено сообщение «Соответствие найдено».
$pattern = "/\d{3}\s\w{3}/";
$string = "123 ABC";
if (preg_match ($pattern, $string)) {
echo "Соответствие найдено";
} else {
echo "Соответствие не найдено";
}Альтернативы и группы
🎯 Альтернативы: выбор из нескольких вариантов
Альтернативы позволяют задать выбор из нескольких возможных вариантов. Для этого используется символ |, который означает «или». Например, если мы хотим найти строки, содержащие слова «cat» или «dog», мы можем использовать выражение cat|dog.
📝 Группы: объединение символов и применение операций
Группы позволяют группировать символы или части выражения и применять к ним операции, такие как квантификаторы. Группы создаются с помощью круглых скобок (). Например, если мы хотим найти строки, которые содержат одно или более повторений последовательности символов «ab», мы можем использовать выражение (ab)+.
🌟 Пример:
В этом примере мы ищем совпадение с шаблоном, который состоит из альтернатив «cat» или «dog», за которыми следует слово «food». Строки «I love cat food» и «I prefer dog food» соответствуют этому шаблону, поэтому они будут выведены в качестве совпадений.
$pattern = "/(cat|dog) food/";
$string1 = "I love cat food"; // Соответствует
$string2 = "I prefer dog food"; // Соответствует
$string3 = "I like bird food"; // Не соответствует
if (preg_match($pattern, $string1)) {
echo "Соответствие найдено";
} else {
echo "Соответствие не найдено";
}👉 Альтернативы и группы расширяют возможности регулярных выражений, позволяя более гибко определять шаблоны поиска. Использование альтернатив позволяет обрабатывать различные варианты текста, а группы помогают группировать символы и применять к ним операции.
💡 Важно понимать, что при использовании альтернатив и групп в регулярных выражениях порядок их указания имеет значение. Выражение (cat|dog) будет искать сначала «cat», а затем «dog». Если нужен другой порядок, можно использовать скобки для явного указания группировки, например, ((dog)|(cat)) будет искать сначала «dog», а затем «cat».
Функции работы с регулярными выражениями в PHP
🎯 Функции проверки соответствия
preg_match — проверяет, соответствует ли строка заданному регулярному выражению. Возвращает 1 при совпадении, 0 в противном случае.
preg_match_all — ищет все совпадения с заданным регулярным выражением в строке и возвращает массив всех найденных значений.
preg_match_callback — выполняет пользовательскую функцию обратного вызова для каждого совпадения с регулярным выражением.
📝 Функции замены совпадений
preg_replace — заменяет все совпадения с заданным регулярным выражением на указанную строку.
preg_replace_callback — выполняет пользовательскую функцию обратного вызова для каждого совпадения с регулярным выражением и заменяет его результатом функции.
preg_replace_callback_array — выполняет соответствующую функцию обратного вызова для каждого совпадения с регулярным выражением, определенным в массиве.
🔁 Функции для поиска и извлечения информации
preg_grep — ищет элементы массива, соответствующие заданному регулярному выражению, и возвращает новый массив с найденными элементами.
preg_split — разделяет строку на подстроки с использованием заданного регулярного выражения в качестве разделителя.
🌟 Пример:
$pattern = "/\d+/";
$string = "Today is 10th June 2023. The temperature is 25 degrees.";
// Проверяем, есть ли совпадение с регулярным выражением
if (preg_match($pattern, $string)) {
echo "Соответствие найдено!";
} else {
echo "Соответствие не найдено.";
}
// Заменяем все числа на "x"
$newString = preg_replace($pattern, "x", $string);
echo $newString;
// Ищем все числа в строке
if (preg_match_all($pattern, $string, $matches)) {
print_r($matches[0]);
}
// Ищем элементы массива, содержащие букву "a"
$array = ["apple", "banana", "orange", "grape"];
$matches = preg_grep("/a/", $array);
print_r($matches);
// Разделяем строку на подстроки по совпадениям
$parts = preg_split($pattern, $string);
print_r($parts);
В этом примере мы используем наиболее популярные функции работы с регулярными выражениями в PHP. Мы проверяем наличие совпадения с помощью preg_match, заменяем совпадения с помощью preg_replace, ищем все числа в строке с помощью preg_match_all, ищем элементы массива, содержащие букву «a» с помощью preg_grep и разделяем строку на подстроки с помощью preg_split.
🚀 В PHP доступно множество функций для работы с регулярными выражениями. Использование этих функций дает вам большую гибкость и мощные инструменты для обработки текстовых данных.
Практические примеры применения регулярных выражений в PHP
📧 Проверка валидности email-адреса
Одной из распространенных задач является проверка валидности email-адреса. Для этого мы можем использовать регулярное выражение, которое проверяет, соответствует ли заданная строка формату email-адреса. Например:
$email = "test@example.com";
if (preg_match("/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/", $email)) {
echo "Email-адрес валиден.";
} else {
echo "Email-адрес невалиден.";
}В этом примере мы используем регулярное выражение /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/, которое проверяет, соответствует ли заданная строка формату email-адреса. Если совпадение найдено, выводится сообщение о валидности email-адреса, в противном случае выводится сообщение о невалидности.
🔍 Извлечение данных из текста
Регулярные выражения также могут быть использованы для извлечения данных из текста. Например, мы можем извлечь все числа из строки с помощью регулярного выражения. Вот пример:
$string = "Today is 10th June 2023. The temperature is 25 degrees.";
if (preg_match_all("/\d+/", $string, $matches)) {
print_r($matches[0]);
} else {
echo "Числа не найдены.";
}В этом примере мы используем регулярное выражение /\d+/, которое ищет все числа в строке. Функция preg_match_all возвращает массив всех найденных чисел, и мы выводим его с помощью print_r.
🌟 Еще примеры:
// Проверка валидности URL-адреса
$url = "http://www.example.com";
if (preg_match("/^(https?|ftp):\/\/[^\s\/$.?#].[^\s]*$/i", $url)) {
echo "URL-адрес валиден.";
} else {
echo "URL-адрес невалиден.";
}
// Извлечение хештегов из строки
$string = "This is a #example string with #hashtags.";
if (preg_match_all("/#\w+/", $string, $matches)) {
print_r($matches[0]);
} else {
echo "Хештеги не найдены.";
}
// Замена ссылок в тексте на HTML-ссылки
$text = "Visit my website at https://www.example.com for more information.";
$newText = preg_replace("/(https?:\/\/[^\s]+)/", "<a href='$1'>$1</a>", $text);
echo $newText;💭 В этих примерах мы использовали регулярные выражения для проверки валидности URL-адреса, извлечения хештегов из строки и замены ссылок в тексте на HTML-ссылки. Это лишь некоторые из множества возможностей, которые предоставляют регулярные выражения в PHP.
🚀 Регулярные выражения являются мощным инструментом для обработки текстовых данных в PHP. Используйте их с умом и экспериментируйте, чтобы решать разнообразные задачи.
Подписывайтесь на канал https://t.me/SamuraisGoal
Чат для обсуждений https://t.me/SamuraisGoalChat

