Regular Expressions

Регулярные выражения (Regular Expressions) - специальный язык для обработки подстрок в тексте. С помощью него можно осуществлять поиск текста по подстрокам, проверять текст на соответствие шаблонам. Регулярные выражения поддерживаются разными языками и реализация мало чем отличается, поэтому одни и те же регулярные выражения можно исползовать, например, в JS и PHP. Основное отличие заключается лишь в методах, используемых для работы с регулярками.

Отличный онлайн-сервис для тестирования регулярных выражений - https://regex101.com/. Имеется подсветка синтаксиса и удобные подсказки.

Полезные регулярные выражения

1. Обработка email.

Любые латинские символы сколько угодно -> @ -> Любые латинские символы сколько угодно -> . -> Любые латинские символы от двух

/^[^@а-яА-Я]+@[^@а-яА-Я]+(?<!\.)\.[^\.а-яА-Я]{2,}$/m

2. Очистка строки от спецсимволов

/[^-_a-zа-яёЁ0-9@\s\.\,\:\/\\]+/ui

3. Поиск имени файла в пути без расширения

/[ \w-]+?(?=\.)/ui

4. Обработка URL

Убираем http, https, www. Оставляем домен и путь

/https?:\\/\\/(?:www\.|)(.*)/ui

Убираем http, https, www, и путь. Оставляем только домен и поддомен (если есть)

/https?:\\/\\/(?:www\.|)([\w.-]+).*/ui

Вытаскиваем ссылку из аттрибута href ссылки a

/<a.*?href=["'](.*?)["'].*?>/i

Получаем все теги <a> в тексте и разбиваем по группам.

  1. Полностью тег с текстом
  2. Текст тега
<a[^>]+>(.+?)<\\\/a>

Получает все пустые html-теги

(<a[^<>]*>\s*<\/a>)

Получает все, что между скобок (1 раз)

\((.*?)\)

Получает все слова на кириллице, разделенные точкой с запятой или точкой

([а-яА-Я]+)(;|.)

Находит двоеточия между угловыми скобками <>. Полезно для протокола SOAP, где используется XML с тегами вида <soap:Body>.

/(<\/?)(\w+):([^>]*>)/ui

Пример убирания двоеточий на PHP

$response = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $response);

Удаление эмодзи из строки:

/[^\p{L}\p{N}\p{Z}\p{P}]/u
  • \p{L}: Unicode-класс символов, соответствующий любой букве.
  • \p{N}: Unicode-класс символов, соответствующий любой цифре.
  • \p{Z}: Unicode-класс символов, соответствующий любому разделителю (пробел, табуляция и т.д.).
  • \p{P}: Unicode-класс символов, соответствующий любому знаку пунктуации.