РНР программирование |
Главная Программа телепередач, энциклопедии и многие другие справочные материалы |
for ($i=0;$i { // Преобразуем все escaped символы в нормальные. Символ разделения ' ' при этом // заменяем на символ с кодом 0x01, чтобы не перепутать. $match = strtr(strtr($matches[1][$i],array(' '=>"\x02",' '=>"\x01")),"\x02",' '); // Проверяем, что из себя представляет строка, которую мы пытаемся обработать if (strpos($match,"\x01")!==false) // Эта строка содержит в себе несколько частей. Это значит, что кроме имени эта // строка содержит какие-то параметры, которые требуют дополнительной обработки. { // Поскольку основная синтаксическая структура у нас состоит из 2 частей - имени // и значения по-умолчанию - получаем эти две основные части в виде отдельных переменных list($key,$default) = explode("\x01",$match,2); // Исправляем regular expression для дальнейшей замены $matches[0][$i] = "/\{$key\ [^\}]+\}/"; // Проверяем, чем является параметр, переданный внутри темплейта. Если он начинается // с одного из специальных символов, то необходима дополнительная обработка этого значения. // Однако это необходимо делать толлько в случае, если в переданных в функцию данных для // замены нет текста для этой подстановки (потому что данные, переданные в качестве // аргумента имеют более высокий приоритет). if ((in_array($default[0],array('#','!'))) && (!isset($params[$key]))) { // Получаем список аргументов. Первый символ отбраcываем, потому что это признак // спеуиальной обработки и не относится к имени. $words = explode("\x01",substr($default,1)); // Поскольку первым в полученном списке стоит имя, которое будет использоваться // обработчиком - берем его в отдельную переменную и убираем из массива аргументов. // Теперь в массиве $words - только список аргументов. $name = array_shift($words); // Проверяем, если количество аргументов - нечетное (т.е. нам необходим еще один, поскольку // все аргументы рассматриваются как пары "имя-значение"), то добавляем пустую строку. if ((sizeof($words)%2)!=0) $words[] = ''; // Формируем массив параметров. Он должен быть в том же виде, в котором он передается // в данную функцию (т.е. имя параметра задается в виде ключа ассоциативного массива). $params = array(); for ($j=0;$j $params[$words[$j]] = $words[$j+1]; if ($default[0]=='#') // Символ '#' указывает на необходимость вставки темплейта с заданным именем $default = insertTemplate($GLOBALS[$name],$params); elseif ($default[0]=='!') // Символ '#' указывает на необходимость вставки результатов работы пользовательской // функции с заданным именем $default = call_user_func($name,$params); }; // Если в списке текстов для подстановки, переданных в качестве параметра в эту функцию, // есть текст для подстановки с таким же именем, то используем его, потому что параметры, // переданные в качестве аргумента имеют более высокий приоритет. Если же такого текста // нет, то используем текст, имеющийся у нас в качестве значения. $replaces[] = (isset($params[$key]))?$params[$key]:$default; } elseif ($match=='l') // Эта строка - escaping для левой фигурной скобки, имеющей специальное значение. $replaces[] = '{'; elseif ($match=='r') // То же самое для правой фигурной скобки $replaces[] = '}'; else // Эта строка имеет только имя. Если в списке текстов для подстановки, переданных // в качестве параметра в эту функцию, есть текст для подстановки с таким именем, // то используем его, в противном случае используем в качестве замены пустую строку. $replaces[] = (isset($params[$match]))?$params[$match]:""; }; // Теперь у нас есть все необходимые данные и мы можем выполнить замену. Поскольку все // строки, которые необходимо заменить в данном темплейте сконвертированы в регулярные // выражения - необходимо просто выполнить замену по имеющимся массивам. Кроме того // здесь же мы возвращаем нормальные значения escaped символам, которые мы убирали в начале. return(strtr(preg_replace($matches[0],$replaces,$template),array("\x03"=>'{',"\x04"=>'}'))); }; ?> Теперь посмотрим, как можно сгенерировать ту же самую простейшую страничку, используя приведенную выше функцию. Файл templates.php содежит описание всех необходимых темплейтов. Очень похоже на предыдущий вариант этого файла, но здесь в темплейтах используется описанный выше синтаксис для вставки текста.
// Основной темплейт для страницы $tplPage =
{menu #tplMenu} {content #tplContent} {footer #tplFooter}
HTML; // Темплейт для меню сайта $tplMenu = {menuItems !createMenu}
HTML; // Темплейт для пункта меню для меню сайта $tplMenuItem =
|
{name} |
Представленная библиотека представляет собой очередную попытку отделить содержание от оформления. Основная идея не нова - использовать специальное оформление внутри статического HTML-текста, что позволит при обработке этого текста заменить специально оформленные разделы на динамически формируемые данные из PHP-скрипта. Другими словами, мы создаем свой собственный "стиль разметки" HTML-текста, а затем этот специально подготовленный HTML-текст обрабатывается из PHP-скрипта. Простейший пример: требуется показывать на сайте текущую дату. Естественно, что сами данные (день, месяц, год, время) будут меняться, поскольку формируются динамически, однако их оформление, скорей всего, будет одним и тем же (предположим, большая синяя надпись в красной рамке). Самым удобным решением - каким-то образом "подсказать" PHP-скрипту, где именно нужно вывести данные, не касаясь стиля их оформления. Для этого в представленной библиотеки используются как простые замены (специальные последовательности символов), так и специальные HTML-теги. |
Наверх Для того, чтобы PHP-скрипт мог использовать библиотеку, в нем должны быть две строчки: // путь к файлам библиотеки из исполняемого PHP-скрипта define('INCLUDE_DIR', 'parse/');
// инициализация библиотеки require_once(INCLUDE_DIR.'init.inc.php'); |
Наверх Библиотека работает так же, как и все остальные библиотеки, занимающиеся парсингом HTML-текста, с добавлением в этот текст данных, полученных из PHP-скрипта :
и заменяет их переменными или константами из PHP-скрипта с совпадающими именами (имена переменных и констант case-sensitive). $var = '1234'; то при вызове в этом PHP-скрипте функции "parseStr", все вхождения вида в исходной строке будут заменены на значение переменной $var: // инициализация переменной $var $var = '1234';
// вызов функции "parseStr" echo parseStr('Variable $var has value ');
// результат работы функции "parseStr" Variable $var has value 1234 Аналогичным образом подставляются значения констант: // инициализация константы MY_CONST define('MY_CONST', 1234);
// вызов функции "parseStr" echo parseStr('Constant MY_CONST has value ');
// результат работы функции "parseStr" Constant MY_CONST has value 1234 ПРИМЕЧАНИЕ: Символы начала переменной/константы ( ) и символы окончания переменной/константы ( #> ) могут быть изменены двумя способами:
o // новые параметры начала и окончания переменных/констант в PHP-скрипте o define('DEFAULT_VARNAME_START', '{'); define('DEFAULT_VARNAME_END', '}');
o // новые параметры начала и окончания переменных/констант в PHP-скрипте o $new_pars = array('varstart' => '{', 'varend' => '}'); o o // изменить правила парсинга $GlobalParser->init($new_pars);
|
главная стр. 1. 2. 3. 4. 5. 6. 7. 8.