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

 

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

 

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

содержащий в каждой строке числовую и текстовую информацию. Нам необходимо получить из этого файла только строки, содержащие числа:

Файл data.txt:

123

abc

php4

Код:

<?php

// Считываем содержимое файла в массив

$data = file('data.txt');

// Получаем массив, содержащий цифровую информацию

$numbers = preg_grep("/\d+/",$data);

// Выводим результат работы

print_r($numbers);

?>

Результат работы будет:

Array

(

    [0] => 123

    [2] => php4

)

Как видите - мы получили все строки, содержащие цифры. Если же нам, например нужно получить только цифры - то выражение необходимо немного изменить: /^\s*\d+\s*$/.

Заключение

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

Программирование на PHP. Седьмой выпуск. Работа с шаблонами. Разработка собственных и использование существующих решений.

В этом выпуске мы поговорим о такой вещи как темплейты (templates) - что это такое, зачем это нужно и почему почти все это используют. Но сначала, как обычно, немного новостей.

Новости

А новости таковы, что версия PHP 4.1.0, о создании которой я говорил в предыдущем выпуске вышла! Правда пока что она доступна лишь в виде исходных текстов (т.е. windows binaries в разделе downloads на www.php.net искать пока бесполезно). Кстати, помимо всего прочего пользователей PHP на платформе Windows порадует тот факт, что разработчики PHP в этой версии говорят об этой версии как о значительно более быстро и стабильно рабоающей под Windows. Полный список изменений можно посмотреть в официальном анонсе (на английском). Спрашивайте новую версию PHP на www.php.net и www.php4win.com.

Еще одна приятная новость ожидает вас в разделе статистики на том же www.php.net. По последним данным PHP продолжает набирать популярность и на данный момент PHP перешагнул отметку в 7 миллионов доменов и 1 миллион IP адресов!

А теперь вернемся непосредственно к теме этого выпуска.

Templates

Что такое templates

Как вы уже знаете (об этом было сказано еще в первом выпуске), PHP - это встраиваемый (embedded) язык. Т.е. его код помещается внутрь HTML страницы и занимается генерацией динамического содержимого. Приведу простейший пример:

<HTML>

<head>

        <title>Простейшая страничка</title>>

<head>

<body>

<!-- Здесь меню сайта -->

        <table width="100%" border="0" cellspacing="0" cellpadding="1">

                <tr>

                        <td><a href="page1.php">Страница 1</a></td>

                        <td><a href="page2.php">Страница 2</a></td>

                        <td><a href="page3.php">Страница 3</a></td>

                </tr>

        </table>

<!-- Непосредственно содержимое страницы, генерируемое PHP -->

        <?php echo '<p>Динамический content страницы</p>'; ?>

<!-- Footer страницы -->

        <p>(с) 2001 Вася Пупкин</p>

</body>

</HTML>

На первый взгляд это очень удобно. И это действительно удобно, но как правило только в случае, если страница несложная и динамического кода в ней немного. А теперь посмотрите на современные сайты в интернете - на каждой странице собрано множество разнообразной информации, причем как правило эта информация представляет собой различную функциональность: Например меню сайта, последние новости, голосование, поиск, ссылки, реклама и т.п. и все это на одной странице. Да и струртура HTML кода подобной страницы довольно сложна. Я думаю, что вы понимаете, что использование метода "встраивания" PHP кода в подобную страницу ничего кроме головной боли и кучи трудноуловимых глюков вам не принесет. Более того, web-программисты (да и не только они) повсеместно стремятся как можно сильнее отделить код сайта от его визуальной части, чтобы не приходилось переписывать код при каждом изменении внешнего вида сайта (а вы знаете, что на больших сайтах внешний вид меняется достаточно часто). Вот здесь-то и возникает идея использования templates как средства разделения внешнего вида и внутреннего кода сайта.

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

Простейшие templates

Простейший способ использования tempates - это создание множества переменных, содержащих кусочки HTML кода. Код самой страницы при этом самостоятельно занимается объединением HTML кода из этих переменных с необходимыми данными для получения результата. Посмотрим, например, как могла бы выглядеть генерация той же самой страницы с помощью простейших темплейтов. Здесь я не стал использовать ни один из распространенных пакетов, потому что просто хочу продемонстрировать вам основную идею.

Файл templates.php содежит описание всех необходимых темплейтов. Если посмотреть на содержимое переменных, описанных в этом файле, то можно заметить, что это просто та же самая страница, но разбитая на множество частей, между которыми должны быть вставлены данные.

<?php

// Начало заголовка страницы

$pageHeaderStart = '<HTML><head><title>';

// Конец заголовка страницы

$pageHeaderEnd = '</title><head><body>';

// Начало меню

$menuStart = '<table width="100%" border="0" cellspacing="0" cellpadding="1"><tr>';

// Конец меню

$menuEnd = '</tr></table>';

// Начало пункта меню

$menuItemCellStart = '<td>';

// Конец пункта меню

$menuItemCellEnd = '</td>';

// Начало content'а страницы

$pageContentStart = '<p>';

// Конец content'а страницы

$pageContentEnd = '</p>';

// Footer страницы

$pageFooter = '<p>(с) 2001 Вася Пупкин</p></body></HTML>';

?>

Файл index.php содержит сам код построения страницы

<?php

// Заголовок страницы

$title = 'Простейшая страничка';

// Содержимое меню

$menu = array(

        array('page1.php','Страница 1'),

        array('page2.php','Страница 2'),

        array('page3.php','Страница 3')

);

// Content страницы

$content = 'Динамический content страницы';

 

// Подгружаем темплейты

include('templates.php');

// Выводим заголовок

echo $pageHeaderStart.$title.$pageHeaderEnd;

// Выводим меню

echo $menuStart;

for($i=0;$i<sizeof($menu);$i++)

        echo $menuItemCellStart.'<a href="'.$menu[$i][0].'">'.$menu[$i][1].'</a>'.$menuItemCellEnd;

echo $menuEnd;

// Выводим content страницы

echo $pageContentStart.$content.$pageContentEnd;

// Выводим footer

echo $pageFooter;

?>

Конечно этот кода выглядит просто ужасно и так (я надеюсь) на самом деле никто не делает. Но основную идею "собирания" HTML кода страницы из кусочков этот пример демонстрирует достаточно хорошо.

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

Большинство этих проблем могут быть решены путем использования несложной системы для подстановок данных в HTML темплейты. Одну из них мы рассмотрим в следующем разделе.

Использование templates с подстановкой данных

Основным отличием систем, основанных на подстановке данных, является то, что они позволяют, используя определенный синтаксис, определять места вставки данных в HTML темплейты. По сути все имеющиеся системы работы с темплейтами основаны именно на этом принципе и единственное, что их различает - синтаксис, используемый для задания темплейтов и набор возможностей, предоставляемый системой.

Приведу одну из самых простых систем, основанных на этом принципе. Это всего лишь одна небольшая функция (чуть больше 40 строчек кода) и была написана мной буквально за пару часов, но, тем не менее, позволяет практически все, что и большинство систем "средного уровня", имеющиеся в интернете. Исходные тексты примеров вы можете взять в виде ZIP архива, а здесь я приведу их в комментариями.

Но сначала краткое описание синтаксиса для описания темплейтов, применяемое в данной системе. Я приведу его в EBNF-подобной системе и затем дам необходимые пояснения.

"Ключ" для подстановки:

<Key> ::= '{'<Key name>[' '<Default value>]'}'

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

Значение по-умолчанию может также быть использовано для задания специальной обработки. Ниже приведены 3 различных типа синтаксиса, допустимые для значения по-умолчанию:

<Default value> ::= <Text>

<Default value> ::= '#'<Template name>[' '<Parameter name>' '<Parameter value>]*

<Default value> ::= '!'<Function name>[' '<Parameter name>' '<Parameter value>]*

Как видите, тип обработки для значения по-умолчанию указывается в первом символе.

Если это символ '#', то все значение рассматривается как "вставить результат обработки темплейта с именем <Template name> с заданными параметрами в качестве значения для этого ключа подстановки". Т.е. обработчик темплейтов будет вызван рекурсивно для обработки тепмлейта с заданным именем и заданным списком данных для подстановки, а результаты обработки этого темплейты будут использованы в качестве значения для подстановки.

Если это символ '!', то процесс обработки похож на предыдущий, с той лишь разницей, что вместо вызова обработчика темплейтов производится вызов пользовательской функции с заданным именем и ей в качестве параметра передается массив данных, заданных в этом ключе (структура массива такая же, как и для самой функции обработки темплейтов). Результаты работы функции будут использованы в качестве значения для подстановки.

Символы, имеющие специальное значение могут быть вставлены в текст, используя их escaping sequences:

Escaping символов, имеющих специальное значение

Вне ключей для подстановки

{

{l}

}

{r}

Внутри ключей для подстановки

{

{{

}

}}

 

 

Ниже приведен текст функции, которая непосредственно занимается обработкой темплейтов, используя описанный выше синтаксис. Текст достаточно поднобно откомментирован.

Файл templates.function.php

<?php

// Вставка в страницу HTML кода на основе темплейтов

// Параметры:

//   $template - темплейт с HTML кодом, который будет использоваться как основа

//   $params   - массив с данными, которые будут использоваться для подстановки.

function insertTemplate($template,$params=array())

{

// Убираем из текста темплейта все escaped символы (они будут заменены

// на необходимые значения позже) Это необходимо, чтобы облегчить задачу

// разбиения темплейтов с помощью регулярных выражений

    $template = strtr($template,array('{{'=>"\x03",'}}'=>"\x04"));

// Используем регулярное выражение чтобы получить массив всех мест внутри темплейта,

// которые должны быть заменены на результаты подстановки.

    preg_match_all("/\{([^\}]+)\}/i",$template,$matches);

// Если не было найдено ни одного места для подстановки -

// просто возвращаем исходный текст темплейта.

    if (sizeof($matches[0])==0)

        return($template);

// В этот массив мы будем собирать тексты, которые будут исползованы для

// подстановок в темплейт.

    $replaces = array();

// Нам необходимо преобразовать все найденные места для подстановок внутри темплейта

// в регулярные выражения для их поиска. Тогда мы сможем впоследствии выполнить

// все подстановки одновременно, используя замену по массиву регулярных выражений.

    for ($i=0;$i<sizeof($matches[0]);$i++)

        $matches[0][$i] = '/'.preg_quote($matches[0][$i],'/').'/';

// Теперь нам необходимо подготовить тексты для замены

// Для этого нам необходимо обработать содержимое каждого из найденных

// мест для подстановок внутри темплейта.

главная                                                                                                                   стр.  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"