РНР программирование

 

   Главная       Программа телепередач, энциклопедии и многие другие справочные материалы

 

 стр.  1. 2. 3. 4. 5. 6. 7. 8.

  • Работа с базами данных

  • Работа с XML/XSLT

  • Что-то еще? Спрашивайте!

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

 

 Программирование на PHP. Шестой выпуск. Регулярные выражения - специальные функции. Примеры.

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

Новости

В мире PHP ожидается сразу 2 революции :-) И это радует, потому как обещает нам еще больше мощи и удобства в программировании на нашем любимом языке! Но обо всем по порядку.

  1. В недрах www.php.net зреет новая версия PHP! Причем не очередная версия из серии 4.0.x, а новая версия 4.1.0! Судя по смене minor version вместо номера micro version нас ждут значительные изменения и дополнения. Стоит вспомнить о том, что, к примеру, PHP3 так и не дожил до смены номера версии на 3.1.x (последняя версия имеет номер 3.0.18). Что именно готовят нам разработчики - пока неизвестно, никакой информации о новой версии на официальном сайте нет. Но особо нетерпеливые могут "пощупать" новую версию уже сейчас, скачав ее по этому адресу: http://www.php.net/~zeev/php-4.1.0RC2.tar.gz

Как видите - это версия 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 - он может взять ее здесь.

  1. Еще более важная новость - компания Zend Technologies объявила о разработке Zend Engine 2.0! Если кто-то вдруг не знает, то Zend Engine - это "сердце и мозги" PHP, его ядро. Поэтому информация о разработке новой версии ядра так важна - это обещает нам действительно нечто совершенно новое, то, чего в PHP еще не было. Любой желающий может познакомиться с описанием нововведений, планируемых в новой версии ядра, скачав документ: Zend Engine version 2.0. Feature Overview and Design (в формате PDF) или прочитав "выжимку" из этого документа здесь. Здесть я приведу лишь краткий список основных нововведений:

    • Новая объектная модель. Многие замечают, что сейчас объекты в PHP реализованы несколько "странно" и неудачно. Новая объектная модель будет более похожа на ту, что реализована в Java и у нас наконец-таки появятся деструкторы, защищенные переменные, множественное наследование и т.п.

    • Поддержка исключений. Будут реализованы такие операторы как try, catch и throw, подобно тому как они реализованы в C++ и Java.

    • Улучшенная поддержка национальных символов и Unicode.

Остается только ждать, когда все эти вкусности будут реализованы на практике (авторы говорят, что на это потребутеся несколько месяцев). Вполне возможно, что после этого нас ожидает уже 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 - результаты поиска будут сгруппированы по номеру регулярного выражения, которое возвратило этот результат (это значение используется по умолчанию).

  • PREG_SET_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 позволит ограничить количество заменяемых фрагментов в тексте.

главная                                                                                                                   стр.  1. 2. 3. 4. 5. 6. 7. 8.

 

1. Что такое PHP?

1. 1. Применение РНР при программировании сайтов

1.2. Программа регистрации и авторизации на вашем сайте

1.3. Программа регистрации и авторизации на сайте с шифрованием пароля

2. Глава посвящена программированию
вообще и программированию в частности
сайтов

3. MySQL элементы управления и взаимодействие с PHP

4. Русский перевод файла "httpd.conf" Для Apache 2.0

5. Русский перевод файла "php.ini"