Найти в Дзене
CODEARMY

Диапазоны в регулярных выражениях

В предыдущем уроке мы убедились, что модификатора g в PHP нет и узнали как переключаться на сайте между preg_match и preg_match_all. Теперь перейдём к диапазонам.

Итак, вариант ab ищет только эти 2 буквы, именно в таком порядке а выражение a56 не найдёт a5 и a6. Как найти любую букву? Нужно использовать диапазон.

Давайте с начала переключимся на простой preg_match, т.е. уберите модификатор g если он у вас стоит.

Диапазон создаётся с помощью квадратных скобок. Внутри него пишем символы, которые хотим найти. Например, если нам нужны все a или b так и напишем ab, но что если мне нужны не только ab, а все буквы?

В теории можно, конечно вписать все буквы, т.е. abcdefg и так до z но это негуманно, эту запись можно укоротить указав в каком диапазоне нам нужны буквы, например, все буквы от a до z записываются так [a-z] мы видим, что нашлось совпадение, но в его результате только одна буква.

Как выбрать все символы, указанные в диапазоне из текста? Нужно переключиться на preg_match_all.

Так будут выбраны все буквы, вне зависимости от того, где они расположены в тексте.

Точно так же поступаем если нам нужны все цифры [0-9], все кириллические буквы [а-я], но тут есть одна проблема: буква ё не входит в этот диапазон и её приходится указывать отдельно вот так [а-яё]. Можно указать все эти правила внутри одного диапазона получится так [a-z0-9а-яё] - что в переводе на человеческий означает "найди любые буквы на русском и английском а так же цифры".

Вы наверное заметили, что если переключиться на preg_match то диапазон находит всего 1 первый символ. Это нормально. Как найти все мы рассмотрим чуть дальше, сейчас потренируемся на этом одном символе и давайте сделаем комбинацию из диапазонов:

текст x1 регулярка [a-z0-9] - означает ищи любые английские буквы или цифры, всё верно, находится буква x

Немного исправим и сделаем 2 диапазона [a-z][0-9] такое регулярное выражение имеет совсем другое значение, прочитать его можно как "любая английская буква а за ней любая цифра".

Если переключиться на preg_match_all то в тексте:

a0 b2 v4 v5 ж1 ц2

мы найдём все такие сочетания.

Вернёмся к вопросу: как найти не одну а много букв. Для этого нужно после диапазона поставить квантор. Подробнее мы рассмотрим их в следующем уроке, а сейчас изучим только один - плюс. Дословно он означает "1 или больше" на простом языке - он выберет всю строку любой длинны, пока она удовлетворяет регулярному выражению.

Например, у нас есть сложное прилагательное, которое пишется через дефис: красно-чёрный ищем в нём любые буквы [а-яё]+

Почему в найденном только первая часть до дефиса? Потому что алгоритм, который парсит строку дошёл до символа дефиса и увидел что это символа нет внутри нашего диапазона. Поэтому результат именно такой. Что сделать что бы получить слово полностью? Нужно добавить дефис внутрь диапазона вот так [а-яё-]+

Экранирование внутри регулярных выражений

В регулярных выражениях все символы делятся на обычные символы и мета-символы, проще говоря, обычные и специальные. Символы можно помещать как просто в регулярные выражения, так и внутрь диапазонов в нём, как выше мы сделали с дефисов. Мета-символы необходимо экранировать.

Рассмотрим пример. Что будет если квадратные скобки входят в строку которую нам нужно найти? Ответ прост, надо добавить их внутрь диапазона, но что бы они ничего не сломали их нужно экранировать, т.е. поставить перед каждой из них обратный слеш. Так же с другими спецсимволами.

В памятке, которую мы открыли в первом уроке есть перечень специальных символов, которые нужно экранировать. Но в нём есть ошибки. Например, здесь написано что угловые скобки нужно экранировать, но в PHP они работают и просто так.

В следующем уроке мы рассмотрим кванторы.

Видео урока: