PHP: регулярные выражения, функция preg match all

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

HTML, CSS, XML и другие формализованные файлы - классические задачи для применения функции preg match all. Не меньший эффект дает поиск адресов, фамилий, номеров телефонов, e-mail и другой информации в неформализованных текстах.

Формат функции

PHP предлагает две функции поиска: preg match и preg match all. Первая ищет первое вхождение шаблона в строке, вторая - все вхождения. Иногда используют термин "совпадение с шаблоном". В первом случае результат функции - "строка совпадает с шаблоном", во втором случае - "в строке найдены совпадения с шаблоном". Формально термин "совпадение" более точно отражает суть, но естественный контекст операции обычно - "поиск" информации. На практике востребовано и одно, и другое. Ниже рассмотрен формат функций.

Результат функции - число, количество совпадений. Все найденные совпадения записываются в массив - matches. В случае функции preg match all можно указать порядок сортировки массива:

  • PREG_PATTERN_ORDER;
  • PREG_SET_ORDER.

Сортировка по первому варианту группирует результаты поиска по номеру регулярного выражения (значение по умолчанию). Во втором случае результаты группируются по месту их нахождения в строке.

Символ - элемент шаблона

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

Построение шаблона - это, прежде всего, указание нужной последовательности символов. Если это четко усвоить, то ошибок в шаблоне не будет. Во всяком случае, будет гораздо меньше.

  • а - это конкретный элемент шаблона - символ.
  • a-z - это элемент шаблона, тоже один символ, но только со значением от a до z - вся латиница в нижнем регистре.
  • 0-9 - это одна цифра, причем любая, а вот 1-3 - только 1, 2 или 3.

Регистр в шаблоне важен. Первый и последний символы шаблона имеют большое значение. Можно указать, с чего начинается шаблон и чем заканчивается.

Шаблон функции

PHP preg match all использует стандартный синтаксис регулярных выражений. Квадратные скобки обозначают один из символов, который в них указан:

  • [abc] только символы a, b, c.
  • [^ABC] все, кроме символов A, B, C.
  • \w и \W - текстовый или не текстовый символ.
  • \s и \S - пробельный или не пробельный символ.
  • \d и \D - цифра или не цифра.

Символы повторения обозначаются фигурными скобками - {n,m} и относятся к предыдущему символу.

  • n обозначает повторение "не менее";
  • m - повторение "не более".

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

Проще говоря, перечислив реальные символы, которые нужны, указав их нужные количества и учтя, что символ "^" соответствует началу, а "$" - концу строки, можно создавать простенькие шаблоны. Анализируя реальные отлаженные регулярные выражения от квалифицированных специалистов, можно обрести прочные знания для создания сложных применений preg match all. Арсенал PHP не ограничен только этими двумя функциями, но они чаще всего используются.

Простая практика

Шаблон для целого числа:

  • "/[0-9]*/"

Тоже шаблон целого числа, но спереди может быть знак ("+", "-"), и спереди/сзади могут быть лишние пробелы:

  • /^[\s|\+|\-]{0,1}[0-9]*/

Аналогично:

  • /^[\s|\+|\-]{0,1}[0-9]*(\.)[0-9]*/ - число с точкой.
  • /[0-9a-z_-]+@[0-9a-z_^\.]+\.[a-z]{2,3}/ - вариант для распознавания e-mail.

Применение собственных шаблонов для preg match all, примеры их в интернете, анализ кода страниц сайтов и другие источники позволяют сформировать собственную библиотеку шаблонов.

Вариантов для поиска информации может быть множество. В частности, приведенные последние две конструкции можно смоделировать иначе. Во многих случаях предпочтение будет иметь тот шаблон, который быстрее и точнее обеспечит нужное совпадение. Применение на PHP preg match all, как и аналогичных функций на других языках, требует практики, внимания и предварительной проверки правильности шаблонов.

Комментарии