Регулярные выражения (PHP). PHP: регулярные выражения, примеры

Регулярные выражения PHPМир информации очень велик и многообразен. Каждый день он стремительно расширяется и развивается. Любое существующее решение на данный момент находится в общем процессе движения. Опыт и знания позволяют понимать процесс достижения цели, но результат ее достижения  — никогда. Вряд ли в обозримом будущем можно будет говорить о результате. Однако очень важно, что стремление к результату представляет собой существенный и необходимый процесс. Даже большие деньги и желание не в силах создать алгоритм, который будет способен на то, что делает человек, особенно когда он не задумывается над тем, что конкретно он делает. В любом положении информационной задачи имеется как минимум одно белое пятно, однако за ним обычно сразу видны и другие чистые пятна.

Интернет-технологии позволили существенно упростить доступ к информации, однако вопрос о том, как наложить на имеющееся желаемое не упростился, а только приобрел новые объемы. Хотя PHP регулярные выражения явно не смогут исчерпать этот пробел, это все же значительный шаг вперед.

Алгоритм + простые функции = шаблон

PHP, предлагая регулярные выражения, значительно уменьшает содержание алгоритма. Однако обычные функции поиска/замены, а также алгоритмы обработки найденного не потеряли свое значение. Новые идеи пока не предвещают информационную революцию. Максимум, на что можно рассчитывать, это компактный код, а также рост умений разработчика правильно формулировать поисковые запросы. Регулярные выражения PHP нужно знать и уметь применять. Однако следует отдавать себе отчет в том, что с появлением нового механизма поиска центр тяжести был перемещен на шаблон. Это своеобразный механизм, который, по сути, заменяет собой множество простых функций поиска, циклов, условий, других операторов. Хорошо иметь качественный и современный инструмент. Важно также видеть и использовать опыт коллег. Однако гарантией успеха является совмещение реальной действительности с виртуальными идеями. Достижение знаний о том, как надо было понимать задачу, чтобы решить ее, чаще имеет большее значение, чем полученный результат. В PHP регулярные выражения представлены несколькими функциями в синтаксисе языка. В интернете можно найти множество полезных примеров. Варианты применения ввиду специфики синтаксиса языка ограничены воображением разработчика. Однако стоит иметь в виду, что далеко не все шаблоны будут работать. Проверка регулярных выражений средствами PHP имеет существенное значение.

Простой поиск символа

Символ далеко не всегда представляет собой один байт информации. Очень часто символ представляет собой элементарный сигнал, который дополнительно несет точный смысл. Кодировка по-разному определяет видимые символы в коде. Символ одновременно может иметь несколько вариантов. Например, символ $ обозначает валюту USD. Однако это может быть и что-то, не обязательно связанное с валютой. Точный смысл может лежать и в переменной PHP, которая всегда начинается с символа $. Символом в программах может быть имя функции в контексте. В области динамического объектно-ориентированного программирования функции, конструкции и регулярные выражения PHP применяются непосредственно для принятия решений. Найденный символ исполняется, это значит, что он самостоятельно определяет, что необходимо делать в том месте, где он был найден, и так, как он посчитает нужным. Просто искать самостоятельно символ/строку не самое простое занятие. Чем больше информации в символе, тем лучше. Не всегда требуется найти десять лучших цен на продукты питания, определиться с изготовителем натяжных потолков или выбрать наиболее подходящие рецепты для новогоднего стола. Иногда нужно оптимизировать простые алгоритмы со сложной информационной арифметикой или в сложных условиях, когда искомый символ нужно выбрать из БД, а строку, в которой находится символ – из сотни сайтов. Цена выбора символа при этом равняется времени выборки из базы данных. Одинокий символ представляет собой не фразу и даже не несколько фраз. Он может быть где угодно и иметь сколь угодно малый объем. Как узнать, что найденное и есть искомое. Давайте в качестве примера рассмотрим поиск цены.

Поиск цены

Мало просто найти в тексте символ $. Недостаточно даже проверить, что перед ним стоит цифра. Если предусмотреть перед символом % точку или цифру, то это будет гарантия того, что цены, у которых впереди стоят денежные символы, не будут учитываться. Также будут пропущены те цены, в которых вообще не указана денежная единица, но на странице присутствует явное указание на нее. Решение поставленной задачи обычным образом может раздуть алгоритм до неузнаваемости и отнимет очень много времени.

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

$cContents = preg_match_all(«/[0-9]+([\$]|usd|у\.е\.|уе){1}/i»; «look e-mail — 2usd;
» ; «find e-mail — 2у.е.;
» ; «work e-mail — уе2;
» ; «check e-mail — $13», $aResult); . ‘; ‘ . implode(‘,’, $aResult[0]) . ‘
‘.

Выражение выдаст ответ «2; 2usd,2у.е.», но при этом ничего не найдет в строке «check e-mail — $13». Если предусмотреть в шаблоне наличие символа сзади или спереди, то можно в подавляющем большинстве случаев быстро достигнуть цели.

$cContents = preg_match_all(«/([0-9]+([\$]|usd|у\.е\.|уе){1})|(([$]|usd|у\.е\.|уе){1}[0-9]+)/i»; «look e-mail — 2usd;
«; «find e-mail — 2у.е.;
«; «work e-mail — уе2;
«; «check e-mail — $13», $aResult); . ‘; ‘ . implode(‘,’, $aResult[0]) . ‘
‘.

В результате получится «4; 2usd,2у.е.,уе2,$13».

Непредусмотренная логика

PHP предлагает регулярные выражения, как и другие инструменты, однако совершенно не обязательно применять их по правилам или использовать другие строчные функции, которые предусмотрены синтаксисом. Перед началом поиска можно превратить искомое в массив. Место, где будет осуществляться поиск, можно по предварительному критерию разбить на составляющие. Часто простая пара функция implode () иexplode() ускоряет и упрощает решение. Приведем следующий пример: в результате предварительных работ был сформирован массив данных о том, сколько картофеля собрала каждая деревня по району. В массиве указывается название деревни и собранный объем. Если в деревне функционирует несколько предприятий, то в строку массива идет название_деревни, название_предприятия и значение «;» по всем предприятиям. В данном случае посчитать общий объем собранного картофеля не представляется возможным. Но если использовать implode (“;”, $aResult), получится длинная строка в которой пары

Название_деревни/Название_деревни.Название_предприятия– собранный объем – будут перечислены через знак “;”. Если сделать на полученном обратное, explode (“;”, @aResult), то получится массив всего, кто сколько собрал. Затем можно удалить из строк все нецифровые символы. Таким образом, мы получим только те цифры, сумма которых будет представлять собой общий объем собранного. Регулярные выражения на PHP в данном примере позволяют вовсе не искать лишнее. Он помогают доступно и просто извлекать требуемые цифровые значения. Все делается быстро и эффективно, какими бы длинными не были названия деревень и предприятий. Такое решение, конечно, не идеально, но оно демонстрирует, что далеко не всегда нужно  следовать правилам. Часто желаемого можно достигнуть весьма необычным образом.

Абстрагируясь от кодировки

Синтаксис алгоритма не позволяет сделать вывод о том, как все выглядит на самом деле. Однако, обеспечив одинаковую кодировку страницы, строки и скрипта, можно погрузиться в задачу, абстрагируясь от технических вопросов. Нужно не только знать, что искать, но и как и что делать, в каком количестве, когда, что менять и каким образом. Регулярные выражения PHP формально выполнены в виде законченного собственного полнофункционального механизма. Однако реализация его аналогов по различным причинам отличается в разных языках. Прежде чем переносить тот или иной шаблон в инструментальную среду для выполнения конкретной задачи, нужно выполнить качественную адаптацию, осуществить проверку на всех возможных вариантах исходных данных. Даже при использовании собственного опыта разработки на PHP, примеры, шаблоны, регулярные выражения и конструкции требуют тщательной проверки. Функционал языка динамично меняется. Также меняется его среда исполнения и синтаксис.

Шаблон: содержание и структуру

То, что было написано ранее, в виде комбинации условных операторов, функций поиска, операции замены, удаления, вставки, заключается в одну строку символов по определенным правилам. Называется такая строка шаблоном регулярного выражения. Значительный объем фактически кодируется определенным образом и исполняется по конкретным правилам. Нельзя заниматься отладкой любого оператора языка, однако выполнить отладку шаблона регулярного выражения нельзя. Этот процесс можно только эмулировать. По общему правилу был принят такой вариант: работает – не работает. Синтаксис используется довольно простой. Однако его восприятие может быть немного затруднено, особенно в начале работы.

Пример простого выражения

Шаблон в простом варианте совпадает со строкой

$cContents = preg_match(«/asdf/i», «asdf», $aResult) . ‘; ‘ . implode(‘,’, $aResult).

В результате получится “1; asdf”, так как функция завершает свою работу при первом же встреченном совпадении шаблона. Результат в этом случае будет таким же, если искать в строке “aaasdf” и в строке “zzzasdfvvv”. Если указать, что первый и последний символ, то итог будет вполне однозначным:

$cContents = preg_match(«/^asdf/i», «asdf», $aResult) . ‘; ‘ . implode(‘,’, $aResult) . ‘
‘; $cContents .= preg_match(«/asdf$/», «asdf», $aResult) . ‘; ‘ . implode(‘,’, $aResult) . ‘
‘.

Должен получиться результат 1; asdf1; asdf. Символы “^” и “$” указывают, с чего шаблон начинается и чем он заканчивается. Результатом действия функции preg_match является количество совпадений. Оно может быть 0, 1 или false при возникновении ошибки. Третий параметр – массив. В него помещается найденный элемент. При использовании функции preg_match_all() поиск будет продолжаться до конца строки.

$cContents = preg_match(«/asdf/i», «asdf123asdf456asdf789», $aResult) . ‘; ‘ . implode(‘,’, $aResult) . ‘
‘; $cContents .= preg_match_all(«/asdf/i», «asdf123asdf456asdf789», $aResult) . ‘; ‘ . implode(‘,’, $aResult[0]) . ‘
‘.

Полученный результат: 1; asdf 3; asdf,asdf,asdf.

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

Функции PHP для работы с регулярными выражениями

Регулярные выражения на PHP обычно представляют собой строки символов, которые записаны определенным образом. По аналогии с другими языками программирования, они обычно записываются в символах “/” … “/” и помещаются в кавычки. В зависимости от используемого алгоритма можно использовать как двойные, так и одинарные кавычки. Одной из основных функций php является pregmatch. Она использует регулярные выражения как совпадение шаблона и останавливается при первом его нахождении. Вариант функции с суффиксом _all ведет поиск всех совпадений и выдает их массив. При помощи функции pregreplace выполняется замена каждого найденного совпадения шаблона. Она также может работать с массивами, позволяя осуществлять проектирование поиска и выполнять замену по большому множеству вариантов.  При помощи функции preg_replace_callback можно разработать интересные варианты работы с регулярными выражениями. Она принимает не текст для замены, а название функции, которая будет осуществлять такую замену. Кроме практического значения здесь также можно реализовать механизмы проверки шаблонов. При разработке и отладке последних это играет довольно существенную роль.

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

Так как языки гипертекста являются по большому счету формализованной информацией, именно они являются исходным материалом. Разработано огромное количество конструкций и шаблонов, которые позволяют довольно эффективно обрабатывать большой объем информации. Механизмы, встроенные в системы управления сайтами или CMS, выполняют значительную часть такой работы. Вовсе неудивительно, что многие CMS стали стандартами для построения сайтов де-факто. Поскольку они являются сопровождаемыми и обновляемыми разработчиками, здесь нет необходимости своими силами выполнять разработку шаблонов. Но очень полезно иметь опыт работы с регулярными выражениями за пределами таких систем.

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

Важная область использования регулярных выражений на PHP связана с появлением библиотек PHP Office. Работа с электронными таблицами и документами всегда имела важное значение. Стандарт OOXML позволил не только разбирать реальные документы, но и формировать их программным путем. В частности, благодаря развитию языков гипертекста появилась реальная возможность выполнить автоматизацию производства документов, имеющих стандартную форму, таких как бизнес-планы и другие информационные объекты. Структура и содержимое таких объектов реально поддается автоматизации и формализации. В связи с использованием для описания языка OOXML процесс разработки регулярных выражений обладает существенными отличиями от традиционной работы с языками разметки CSS и HTML в первую очередь. Кроме разметки и непосредственно самого контента, реальный документ имеет еще множество других деталей. Так, например, документ, который был создан программой автоматически, будет иметь точное и строгое содержание. Документ, сформированный и обработанный пользователем, будет иметь содержание, расписанное по большому количеству тегов. Любая работа с документом приводит к тому, что его семантика может оставаться одинаковой, но при этом будет расписана по различному количеству конструкций.

Естественная информация

Постановка задачи – уже сама по себе информация. В результате решения задачи также будет получена информация. Если представить постановку задачи в виде документа, человек получает определенную семантику, которая в ходе уточнения специалистами может привести не только к множеству вариантов одного и того же документа, но и к его версиям, имеющим различное содержание. Так, например, задача, постановка которой определяется фразой «Решить квадратно уравение» не будет после редактирования выглядеть как «Решить квадратное уравнение». Если сначала была исправлена первая ошибка, а затем вторая, то естественная информация будет иметь вид: “[Решить][][квадратно][e] [] [урав][н][ение]”. Однако скобки вовсе не гарантируют, что задача будет выглядеть именно так в тегах OOXML. После каждого процесса редактирования задачи можно легко собрать информацию воедино, однако каждый раз эта процедура будет осуществляться по различным алгоритмам. По сути, регулярные выражения, как инструмент формализации информационных задач, стали небольшим отступлением от формальных гипертекстовых структур к естественной информации.

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

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