Регулярные выражения в PHP

Проверка соответствия строки определённому шаблону выполняется через regex, чей синтаксис составляет одну из самых сложных единиц языка PHP при его полном изучении. Для большинства задач подойдут базовые наборы символов, задаваемые в регулярных выражениях.

Описание регулярных выражений

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

Следует стараться не злоупотреблять regexв частях кода, где можно возложить выполняемые действия на иные функции по причине значительно ускоренной обработки последних. Обилие «регулярок» также затрудняет чтение скрипта людьми, что особенно актуально при возвращении к редактированию программы по истечении длительного времени с момента её написания и отсутствии комментариев по ходу кода.

Запись regex описывается следующим образом — строка заключается в кавычки, за первой следует разделитель, далее – правило, по которому будет проводиться проверка, и, после повтора символа-разделителя, перечень необязательных флагов. Отбивать части выражения может любой знак, за исключением обратного слэша, букв, цифр, пробела. Наиболее распространённый вариант – косая черта, нередко встречаются тильда или хэш.

Данный род информации чувствителен к регистру. Также следует уделить внимание факту разного поведения секунд и двойных кавычек при интерпретации — данные в первых выводятся «как есть», а во втором случае выводятся значения используемых переменных, а не только их названия.

Связанные функции

Сами по себе regex выступают шаблонами для работы с функциями, чьи принципы взаимодействия изменяются от одной спецификации PHP к другой в сторону улучшения скорости обработки, однако задержки по-прежнему ощутимы, что может считаться особенностью ядра языка. Несмотря на это, их умеренное использование не приведёт к весомым проблемам в работе программ и, в частности, «userexperience» – мнениях пользователей о скорости сайта.

Список основных функций представлен следующим образом:

  • preg_match(); – поиск совпадения в строке. Выдаёт результаты в формате «Булев тип»: true при нахождении и false при отсутствии соответствующей шаблону информации;
  • preg_match_all(); действует по похожему принципу, что preg_match();, но выдаёт количество обнаруженных вхождений;
  • preg_replace(); находит попадающий под заданный фильтр фрагмент строки и заменяет его на указанный;
  • pregi_replace();, вдобавок к действиям preg_replace();, не является чувствительным к регистру;
  • preg_split(); разбивает строку на части по паттерну;
  • preg_grep(); работает схоже с preg_match();, но возвращает массив фрагментов;
  • preg_quote(); помогает составить regex, добавляя символ «\» слева от служебных знаков.

Устаревшие функции ereg(); и eregi();, несмотря на наличие соответствующего предупреждения на официальном сайте PHP начиная с релиза 5.3.0 и полное удаление в 7.0.0, встречаются на некоторых сайтах-справочниках. Использование не рекомендуется, а может быть и полностью невозможным. На замену обеим пришла preg_match();.Похожая судьба и у split, spliti, вместо которых следует указывать preg_split();.

Модификаторы

Эта тема относится больше к функциям, нежели к regex, но заслуживает внимания ввиду вышеупомянутого исчезновения eregi(); – для использования её аналога – preg_match();, следует задействовать константу PCRE_CASELESS, что выглядит данным образом:

<?php
$subject = «abcxyz»;
$pattern = ‘/^xyz/’;
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches); # Результат: Array ( [0] => Array ( [0] =>xyz [1] => 0 ) )

Аналогичны действия и с preg_split();.

Флаги-модификаторы служат для внесения дополнительных параметров в программы, поддерживающие работу с ними, и позволяют языку избавляться от множества похожих по работе функций, требующих запоминания синтаксиса каждой.

Флаги

У регулярных выражений тоже присутствуют модификаторы, называемые индикаторами или флагами. Они вводятся в круглых скобках либо после закрывающего знака и представлены в следующем списке:

  • i – независимость регистра при выполнении поиска;
  • m – многострочная обработка;
  • u– работа с раскладками, отличающимися от английской – например, кириллицей;
  • U– инвертирование «жадности» – параметра, показывающего, какая по длине строка будет обработана первой;
  • s – знак точки будет соответствовать переносу строки;
  • x – игнорирование пробелов, при котором следует заменять их обратными чертами.

Для отключения параметров следует указать минус перед буквой.

Метасимволы

В выражениях знаки делятся на обрабатывающиеся буквально, и на те, что служат указателями в составлении шаблонов. Последние именуются метасимволами и выполняют следующие роли:

  • . – любой один знак, не считая возврата каретки;
  • ^ – начало строки;
  • $– конец строки;
  • * – любое неотрицательное число вхождений;
  • + – указанный перед плюсом символ представлен минимум 1 раз;
  • \– обработка элемента, являющегося метасимволом, как обычной части regex;
  • a-z – строчные буквы;
  • A-Z– заглавные буквы;
  • 0-9 – цифры от 0 до 9;
  • […] – класс определённых знаков;
  • |– разделитель между альтернативными вариантами, срабатывающими даже если предыдущий вернул ненулевое значение;
  • \d – любая цифра;
  • \s – пробелы и табуляция (клавишаTab);
  • \b– поиск по началу или концу слова.

Повторения

Можно задействовать одинаковые метасимволы несколько раз подряд, вводя код вида \d\d, чтобы найти две и более комбинаций (зависит от числа \d и подобных), однако программа будет выглядеть проще при использовании квантификаторов, отвечающих за повторение действий:

  • x+ – один или несколько x;
  • x*– ноль или несколько x;
  • x? – один xили ноль;
  • x{5} – пять x;
  • x{5,8} – от пяти до восьмиx;
  • x{5,}– пять и более x.

Группы

По умолчанию флаги повторения действуют только на последний элемент комбинации. Во избежание этого можно указывать квантификаторы после каждой буквы или обратить внимание на более удобный вариант в лице круглых скобок. В них можно заключить буквы, а после – поставить модификатор, чтобы обработать сразу несколько знаков.

Примеры использования

preg_match();
<?php
if(preg_match(«/world/i», «Hello, world»)) {
echo»Вхождение найдено»; # Результат
} else {
echo»Вхождение не найдено»;
}

Функция используется для проверки, присутствует ли в строке фрагмент, соответствующий заданному шаблону, и поддерживает установку различных флагов. Есть аналог, не требующий regex и, благодаря этому, обладающий более высокой скоростью развёртки – strpos();,обеспечивающий поиск подстроки.

preg_match_all();
<?php
$string = «Sphinx of black quartz, judge my vow!»;
$pattern = «/o/i»;
echopreg_match_all($pattern, $string); # Результат: 2

С помощью preg_match_all(); производится глобальный поиск по выражению, а не сам факт присутствия хотя бы одного из них. Возвращаемый результат – число вхождений, которое будет равняться нулю при отсутствии совпадений.

preg_replace();
<?php
$pattern = «/Sphinx/i»;
$new = «Anubis»;
$original = «Sphinx of black quartz, judge my vow!»;
echopreg_replace($pattern, $new, $original); # Результат: 2

Для замены части строки, попадающей под шаблон, на что-то другое, используется preg_replace();.

Советы

  • Обновления языка направлены на минимизирование количества использования регулярных выражений, не рекомендуется злоупотреблять ими и в коде. Скрипты, тесно связанные с regex, выполняются медленно, а пользователи сайта могут оказаться нетерпеливыми и просто закрыть страницу, что негативно скажется на графе «Отказы» в сервисах для ведения статистики – например, в Яндекс.Метрике при быстром покидании страницы посещение задаётся «провальным».
  • Ярким доказательством тенденции служит появление флага FILTER_VALIDATE_EMAIL, который служит для проверки валидности введённого электронного адреса и заменил длинное регулярное выражение, к тому же требовавшее частых самостоятельных правок из-за изменений в стандартах email.
  • Если нужно найти часть текста «как есть», лучше использовать функции, не связанные с regex. Заменой preg_match(); послужат strpos(); и strstr();. Это поможет значительно улучшить опыт взаимодействия – опять же, речь идёт о скорости загрузки, важной для SEO и также способной оптимизироваться с помощью других решений, в том числе касающихся front-end.

Добавить комментарий

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