РНР программирование |
Главная Программа телепередач, энциклопедии и многие другие справочные материалы |
Конечно, материал не обязательно будет идти именно в такой последовательности, здесь многое зависит от вас и от вашей реакции на наши статьи. Если вы хотите узнать что-то, если у вас есть вопрос или проблема и вы не знаете ответа на них - пишите, спрашивайте, мы постараемся вам помочь!
Программирование на PHP. Шестой выпуск. Регулярные выражения - специальные функции. Примеры. Сегодня мы продолжим тему, начатую в предыдущем выпуске и поговорим о функциях PHP для работы с регулярными выражениями. Но сначала немного информации, которая, безусловно, заинтересует каждого кто программирует на PHP. Новости В мире PHP ожидается сразу 2 революции :-) И это радует, потому как обещает нам еще больше мощи и удобства в программировании на нашем любимом языке! Но обо всем по порядку.
Как видите - это версия 4.1.0 release candidate 2. Естественно, что никаких windows binaries там нет, только исходники (причем, скорее всего в виде, пригодном для сборки только под Unix). Если у вас есть возможность скачать/собрать эту версию - вам повезло, если же нет - придется ждать официального выпуска новой версии. Вообще с новыми версиями PHP творится что-то странное... Возможно это отчасти объясняется тем, что разработчики языка заняты созданием этой новой версии и не хотят отвлекаться на мелочи, возможно еще чем-то - не знаю. Но судите сами. Последняя версия PHP, доступная для скачивания с официального сайта - 4.0.6. В то же время на сайте www.php4win.com мы с удивлением можем обнаружить версию... 4.0.8! :-) Правда, это т.н. "версия для разработчиков", но возникает закономерный вопрос: "А где, в таком случае версия 4.0.7"? Ответ лично мне неизвестен... Кстати, если кто-то хочет скачать и попробовать версию 4.0.8 - он может взять ее здесь.
Остается только ждать, когда все эти вкусности будут реализованы на практике (авторы говорят, что на это потребутеся несколько месяцев). Вполне возможно, что после этого нас ожидает уже PHP 5.0! А теперь вернемся непосредственно к теме этого выпуска. Регулярные выражения Функции PHP для работы с регулярными выражениями В PHP существует несколько функций для работы с регулярными выражениями. Все они используют один и тот же парсер регулярных выражений для своей работы, но при этом преследуют различные цели. Ниже мы рассмотрим все эти функции. Я буду приводить описание синтаксиса каждой функции в том виде, в котором она описана в PHP Manual, чтобы вам легче было разобраться. Функция preg_match() Синтаксис: int preg_match (string pattern, string subject [, array matches]) Эта функция предназначена для проверки того, совпадает ли заданная строка (subject) с заданным регулярным выражением (pattern). В качестве результата функция возвращает 1, если совпадения были найдены и 0, если нет. Если при вызове функции был задан необязательный параметр matches, то после работы функции ему будет присвоен массив, содержащий результаты поиска по заданному регулярному выражению. Заметьте, что вне зависимости от того, сколько именно совпадений было найдено при поиске - вам будет возвращено только первое совпадение. Рассмотрим пример того, как это работает:
$str = "123 234 345 456 567"; // Строка для поиска $result = preg_match('/\d{3}/',$str,$found); // Производим поиск echo "Matches: $result print_r($found); // Выводим результат поиска ?> Результатом работы этой программы будет: Matches: 1
Array ( [0] => 123 ) Если вы внимательно прочитали предыдущий выпуск и понимаете, как работают регулярные выражения, то вы должны заметить, что реально функция preg_match() обнаружила в заданной строке 5 совпадений с заданным выражением, но вернула только первое из них. Казалось бы, что в этом случае было бы логичнее возвращать результаты поиска в виде строки, а не в виде массива, но это не так. Вспомните, что регулярное выражение может содержать в себе внутренние регулярные выражения, которые также возращают результат. А для того, чтобы вернуть результаты поиска по всем регулярным выражениям нам как раз и требуется массив. Для того, чтобы проиллюстрировать сказанное выше давайте немного изменим регулярное выражение и посмотрим на результат:
$str = "123 234 345 456 567"; // Теперь мы не просто ищем трехзначное число, // но и получаем его среднюю цифру $result = preg_match('/\d(\d)\d/',$str,$found); echo "Matches: $result print_r($found); ?> Результат будет следующим: Matches: 1
Array ( [0] => 123 [1] => 2 ) Как видите - здесь присутствуют результаты поиска по всем имеющимся регулярным выражениям. Функция preg_match_all() Синтаксис: int preg_match_all (string pattern, string subject, array matches [, int order]) Эта функция очень похожа на предыдущую и предназначена для тех же самых целей. Единственное ее отличие от preg_match() состоит в том, что она осуществляет "глобальный" поиск в заданном тексте по заданному регулярному выражению и, соответственно, находит и возвращает все имеющиеся совпадения. Посмотрим, как отличается работа этой функции на том же самом примере:
$str = "123 234 345 456 567"; $result = preg_match_all('/\d{3}/',$str,$found); echo "Matches: $result print_r($found); ?> Результат работы: Matches: 5 Array ( [0] => Array ( [0] => 123 [1] => 234 [2] => 345 [3] => 456 [4] => 567 ) ) Как видите - здесь мы получили все найденные совпадения и их количество в качестве результата. Необходимо обратить ваше внимание на дополнительный параметр, появившийся в этой функции по сравнению с preg_match(): order. Значение этого параметра определяет структуру выходного массива с найденными совпадениями. Его значение может быть одним из перечисленных ниже:
Для того, чтобы лучше понять разницу между этими значениями, посмотрим на результат работы одного и того же скрипта при использовании каждого из них: Сначала посмотрим на то, как выглядит результат при использовании PREG_PATTERN_ORDER:
$str = "123 234 345 456 567"; $order = PREG_PATTERN_ORDER; $result = preg_match_all('/\d(\d)\d/',$str,$found,$order); print_r($found); ?> Результат: Array ( [0] => Array ( [0] => 123 [1] => 234 [2] => 345 [3] => 456 [4] => 567 ) [1] => Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 [4] => 6 ) ) Как видите - массив результатов содержит внешние индексы, соответствующие номерам регулярных выражений, от которых получен результат (индекс 0 имеет основное регулярное выражение). По этим индексам в массиве расположены массивы, содержащие непосредственно найденную информацию, причем индекс в этом внутреннем массиве соответствует "порядковому номеру" данного фрагмента в исходном тексте. Теперь попробуем то же самое, но с PREG_SET_ORDER:
$str = "123 234 345 456 567"; $order = PREG_SET_ORDER; $result = preg_match_all('/\d(\d)\d/',$str,$found,$order); print_r($found); ?> Результат: Array ( [0] => Array ( [0] => 123 [1] => 2 ) [1] => Array ( [0] => 234 [1] => 3 ) [2] => Array ( [0] => 345 [1] => 4 ) [3] => Array ( [0] => 456 [1] => 5 ) [4] => Array ( [0] => 567 [1] => 6 ) ) Как видите - здесь основной массив содержит результаты поиска, сгруппированные по порядку их нахождения в тексте, причем каждый результат представляет собой массив с результатами поиска по этому найденному фрагменту для всех имеющихся регулярных выражений. Функция preg_replace() Синтаксис: mixed preg_replace (mixed pattern, mixed replacement, mixed subject [, int limit]) Эта функция позволит вам произвести замену текста по регулярному выражению. Как и в предыдущих функциях, здесь производится поиск по регулярному выражению pattern в тексте subject, и каждый найденный фрагмент текста заменяется на текст, заданный в replacement. Задание необязятельного параметра limit позволит ограничить количество заменяемых фрагментов в тексте. |