Регулярные выражения (regexp) для простых операций

,

Что такое регулярные выражения?

…Формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов…

Википедия

Говоря проще — язык для умного поиска в тексте. Регулярные выражения (Regular Expressions / Eng) используют спецсимволы для обозначения групп букв/цифр/пунктуации и других частей текста. Эта тема широко освещена на разных сайтах, но мы остановимся на практическом применении в рамках задач системы управления контентом сайта Adx CMS.

Пример 1. Модуль перенаправлений, или «редиректы»

Решаемые задачи — поймать несколько чем-то похожих ссылок и перенаправить на «правильную» страницу либо вернуть код ошибки.

Задача 1. Остановить злоумышленников. 

Реальные записи из журнала запросов:

  1. https://online-media.ru/.git/config — попытка найти ссылку, имя пользователя, а если повезёт и пароль к репозиторию исходного кода сайта.
  2. https://online-media.ru/blog/.git/config — аналогично, но в другой папке.
  3. https://online-media.ru/blog/.env — попытка найти случайно залитый программистом файл с переменными окружения блога.

Собираем выражение /(\.git/config|\.env)$, добавляем, проверяем — работает. Теперь злоумышленник получит ошибку 400 (Bad request или Ай-я-яй, нехорошо поступаешь) при такой попытке.

Скриншот формы редактирования редиректа с регулярным выражением

Разбираем регулярное выражение, последовательно:

  1. / — слэш, разделитель пути из URL. Никакой магии, просто символ.
  2. (\.git/config|\.env) — группа выбора логическое ИЛИ. При поиске должна найтись либо строка .git/config либо строка .env.
    • Внутри строк используется \. — «заэкранированный» символ . (точка). Если точку не заэкранировать, то она будет означать не саму точку, а «любой символ».
  3. $ — символ конца строки.

Читаем выражение по-русски: слэш, за ним одна из строк «.git/config» или «.env», затем конец строки. В целом - несложно, но действенно.

С помощь группы ИЛИ можно собрать более двух строк, примеры:

  1. /(portal|about|test-page)/ — одна из трёх строк.
  2. /(www|web|wwwroot|data|database|db|bak|backup)\.(zip|rar|7z)$ — тоже реальный пример, попытка найти забытый програмистом архив с данными, кодом или резервной копией сайта.

Задача 2. Перенаправить несколько ссылок со старой версии сайта на одну страницу.

Есть много ссылок вида https://mysite.com/news/12/, https://mysite.com/news/25/, https://mysite.com/news/439/ и т.д. В адресе явно виден префикс «news» и цифровые идентификаторы каждой из новостей. Перенаправим все эти страницы на список новостей, выражение — /news/\d+/$.

В выражении видим уже знакомый нам символ конца строки $. Также видим «заэкранированную» слэшом букву «d» \d+. Эта крайне полезная последовательность означает «цифры в количестве одна или больше», а именно \d — цифра и  + — спецсимвол «один или больше».

Поделиться: