Регулярные выражения в 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