Регулярные выражения в 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 не будет опубликован. Обязательные поля помечены *