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

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *