КРАТКАЯ СПРАВКА
include("class.FastTemplate.php3"); $tpl = FastTemplate("/path/to/templates"); $tpl->define( array( main => "main.tpl", row => "table_row.tpl", all => "table_all.tpl" ));
$tpl->assign(TITLE, "I am the title."); $defaults = ( array( FONT => '<font size=+2 face=helvetica>', EMAIL => 'cdi@thewebmasters.net' ));
$tpl->assign($defaults); $tpl->parse(ROWS, ".row"); // the '.' appends to ROWS $tpl->parse(CONTENT, array("row", "all")); $tpl->parse(CONTENT, "main"); $tpl->FastPrint(CONTENT);
$raw = $tpl->fetch("CONTENT"); echo "$raw\n";
"Меняющиеся" переменные
Иногда бывает удобно иметь переменную с меняющимся именем. Это переменная, имя которой может устанавливаться и использоваться динамически. "Нормальная" переменная определяется выражением, таким как:
$a = "привет"; |
"Меняющаяся" переменная берет значение переменной и рассматривает его как имя переменной. В примере выше значние привет может быть использовано как имя переменной, путем введения двух знаков доллара, т.е.
$$a = "мир"; |
С этого момента определены две переменные и содержатся в дереве символов PHP: $a с содержимым "привет" и $привет с содержиым "мир". таким образом, выражение
echo "$a ${$a}"; |
произведет тот же вывод, что и
echo "$a $привет"; |
т.е. в обоих случаях выведется привет мир.
При использовании "меняющихся" переменных в массивах, вы должны разрешить проблему неоднозначности. То есть, если вы пишите $$a[1] то парсеру нужно знать, имеете ли вы ввиду то что $a[1] - это переменная, или вы хотите использовать $$a как переменную и взять из нее элемент с индексом [1]. Синтаксически разрешение неоднозначности выглядит так: ${$a[1]} для первого случая и ${$a}[1] для второго.
Перевод на русский язык © Алексей Мельник, 2002.
No_strict()
Выключает предупреждающие сообщения о переменных шаблона, которые нельзя заменить. Вызов no_strict() требуется, чтобы заменить неизвестные переменные пустой строкой. По умолчанию, все экземпляры FastTemplate ведут себя так, будто был вызван метод strict(). Точно так же no_strict() должен быть вызван для каждого экземпляра FastTemplate.
$tpl = new FastTemplate("/путь/к/шаблонам"); $tpl->no_strict();
Область действия переменных
Область действия переменной - это контекст, в котором она определена. Большая часть всех переменных PHP имеет единственную облать действия. Эта область измеряется включаемыми (included) и требуемыми (required) файлами. Например:
$a = 1; include "b.inc"; |
Здесь переменная $a будет доступна внутри включаемого скрипта b.inc. Однако, внутри пользовательских функций вводится локальная область действия. Любая переменная, используемая внутри функции по умолчанию ограничена локальной областью действия функции. Например:
$a = 1; /* Глобальная область действия*/
function Test() { echo $a; /* Ссылка на переменную с локальной областью действия*/ } Test(); |
Этот скрипт не производит никакого вывода, так как выажение echo ссылается на локальную версию переменной $a, а она не связана со значением в данной области действия. Как вы можете заметить, здесь есть небольшие различия с языком C в том, что глобальные переменные в C автоматически доступны в функциях, пока явно не перекрываются локальными определениями. Это может вызвать проблемы, так как человек может ненамеренно изменить глобальную переменную. В PHP глобальные переменные должны быть объявлены таковыми в функции, если их собираются использовать в этой функции. Пример:
$a = 1; $b = 2;
function Sum() { global $a, $b; $b = $a + $b; } Sum(); echo $b; |
Скрипт, приведенный выше, выведет "3". Описав переменные $a и $b как глобальные в функции, все ссылки на любую из них будут указывать на глобальные версии. Нет ограничений на число глобальных переменных, которыми можно манипулировать в функции.
Второй путь получить доступ к переменным в глобальной области действия - использовать специально определенный в PHP массив $GLOBALS. Предыдущий пример может быть переписан так:
$a = 1; $b = 2;
function Sum() { $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; } Sum(); echo $b; |
Массив $GLOBALS - это ассоциативный массив с именами глобальных переменных в качестве ключей и значениями соответствующих переменных в качестве элементов массива.
Другая важная особенность области действия переменных - это статические переменные. Статические переменные существуют только в локальной области действия функции, но они не теряют своих значений когда программа покидает эту область действия. Рассмотрим следующий пример:
function Test () { $a = 0; echo $a; $a++; } |
Эта функция достаточно бесполезна, так как каждый ее вызов будет устанавливать $a в 0 и печатать "0". Оператор $a++, увеличивающий переменную бесцелен, так как стоит функции завершиться, переменная $a исчезнет. Чтобы сделать подсчитывающую функцию полезной и не теряющей текущее значение счетчика, переменная $a объявляется статической:
function Test() { static $a = 0; echo $a; $a++; } |
Теперь, вызванная в любое время, функция Test() напечатает значение $a и увеличит его.
Статические переменные также предоставляют один из способов работы с рекурсивными функциями. Рекурсивной называется функция, вызывающая себя сама. Нужно быть осторожным при написании рекурсивных функций, так как возможно сделать рекурсию бесконечной. Вы можете создать гарантированный путь прекращения рекурсии. Следующая простая функция рекурсивно считает до 10, используя статическую переменную $count, как сигнал для останова:
function Test() { static $count = 0; $count++; echo $count; if ($count < 10) { Test (); } $count--; } |
Перевод на русский язык © Алексей Мельник, 2002.
в котором есть переменные. Когда
Что такое шаблон?
Шаблон — это текстовый файл, в котором есть переменные. Когда шаблон анализируется, переменные заменяются текстом. (Размер текста может быть от нескольких байт до нескольких сотен килобайт.) Вот простой шаблон с одной переменной ('{NAME}'):
Привет {NAME}. Как твои дела?
Когда нужно использовать шаблоны?
Шаблоны очень полезны при программировании CGI, так как добавление HTML к вашему коду затрудняет работу с ним и заставляет вас проделывать все изменения в HTML. Полностью помещая HTML в отдельные файлы шаблонов, вы даете возможность дизайнеру графики или интерфейса изменять вид вашего приложения без необходимости тревожить вас, а также лишает их возможности покопаться в вашем коде PHP.
Почему выгоден FastTemplate?
Скорость
FastTemplate разбирает отдельное регулярные выражения. Он производит только простую замену переменных (т.е. вы не можете добавить какую-то логику в шаблон — вся ваша логика должна находиться в коде). Вот почему он называется 'FastTemplate' (Быстрый Шаблон)!
Гибкость
API ясное и гибкое, и позволяет вам выстраивать сложные HTML документы/интерфейсы. Он также полностью реализован на PHP и (наверняка) работает под Unix и NT. Также в нем нет ограничений по построению документов HTML — его можно использовать для построения любых ASCII-документов (postscript, XML, электронная почта — что угодно).
Какие основные шаги использования FastTemplate?
Основные шаги следующие:
1. define 2. assign 3. parse 4. FastPrint
Их подробное описание дано ниже в разделе ОСНОВНЫЕ МЕТОДЫ.
Основы
Переменные в PHP представляются знаком доллара со следующим за ним именем переменной. Имена переменных регистрозависимые.
Имена переменных формируются по тем же правилам что и остальные метки PHP. Правильное имя начинается с буквы или символа подчеркивания, за ним следуют любое количество букв, цифр или символов подчеркивания. В виде регулярного выражения переменные могут быть представлены так: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
Замечание:
Здесь мы предполагаем, что буквы - это a-z, A-Z, и ASCII символы в диапазоне от 127 до 255 (0x7f-0xff).
Для тех, кто еще сомневается - $Вася - тоже КОРРЕКТНОЕ имя переменной.
$var = "Bob"; $Var = "Joe"; echo "$var, $Var"; // выводит "Bob, Joe"
$4site = 'not yet'; // неверно - начинается с цифры $_4site = 'not yet'; // верно - начинается с подчеркивания $tфyte = 'mansikka'; // верно - 'ф' ASCII символ с кодом 228. |
В PHP 3 переменные всегда передавались по значению. То есть, когда вы присваивали выражение переменной, значение исходного выражения целиком копировалось в переменную. Это означало, например, что после присвоения значения одной переменной другой изменение любой из этих переменных не оказывало эффекта на другую. Более подробную информацию смотрите в разделе Выражения.
PHP 4 предлагает другой путь присвоения значений переменным: связывание по ссылке. Это означает, что новая переменная просто ссылается (другими словами, "становится псевдонимом" или "указывает на") исходную переменную. Изменения новой переменной повлияют на исходную и наоборот. Также это означает, что копирования не происходит; присваивание происходт быстрее. Но все же любое увеличение скорости будет заметно только в циклах присваиваний больших массивов или объектов.
Связывание по ссылке представляется амперсандом (&) перед началом переменной, которая связывается (исходная переменная). Например, следующий код выводит 'Меня зовут Вася' дважды:
Стоит заметить, что только именованные переменные могут присваиваться по ссылке.
Перевод на русский язык © Алексей Мельник, 2002.
Parent
Вы можете сами писать код, который ссылается на переменные и функции в базовых классах. Это особенно удобно, если ваш производный класс - усовершенствование или специализация вашего базового класса.
Вместо использования литерального имени базового класса в вашем коде, вы можете использовать специальное имя parent, которое указывает на имя вашего базового класса, определенного в директиве extends вашего класса. Делая это, вы избегаете использования имени вашего базового класса в больше чем в одном месте. Если вы изменените дерево наследования во время реализации, изменение легко сделать, редактированием директивы extends вашего класса.
class A { function example() { echo "Я - A::example() и обеспечиваю общую функциональность. \n"; } } class B extends A { function example() { echo "Я - B::example() и обеспечиваю дополнительную функциональность. $b = new B; // Здесь вызывается B::example(), которая передает // вызов A::example(). $b->example(); |
Перевод на русский язык © Алексей Мельник, 2001.
Parse(RETURN, FileHandle(s) )
Функция parse — это главная функция в FastTemplate. Она принимает новую пару ключ/значение, где ключ — это ЦЕЛЬ, а значения — это ИСХОДНЫЕ шаблоны. Эта функция может использоваться в трех видах:
$tpl->parse(MAIN, "main"); // обычный $tpl->parse(MAIN, array ( "table", "main") ); // смешанный $tpl->parse(MAIN, ".row"); // добавляющий
В обычной версии загружается шаблон с именем ``main'', если он еще не был загружен, все переменные заменяются значениями, а затем результат сохраняется в FastTemplate как значение MAIN. Если переменная '{MAIN}' позде появится в шаблонах, она будет заменена на значение разобранного шаблона ``main''. Это позволяет вам легко строить вложенные шаблоны, что приближает нас к смешанному стилю.
Смешанный стиль разработан с тем, чтобы облегчить построение вложенных шаблонов. Следующие примеры эквивалентны:
$tpl->parse(MAIN, "table"); $tpl->parse(MAIN, ".main");
// то же самое, что и:
$tpl->parse(MAIN, array("table", "main")); // в таком виде меньше вызовов функций, и код понятнее
Важно заметить, что при использовании смешанного стиля каждый шаблон, кроме первого, должен содержать переменную, в которую будет записан результат разбора. В представленном выше примере 'main' должен содержать переменную '{MAIN}', поскольку в ней сохраняются результаты разбора 'table'. Если 'main' не содержит переменной '{MAIN}', то результаты разбора 'table' будут потеряны.
Добавляющий стиль позволяет добавлять разобранный результат к целевой переменной. Ставя точку . перед определенным файловым хэндлом сообщает FastTemplate о том, что результат разбора этого шаблона должен быть добавлен к возвращенному результату. Это особенно полезно при построении таблиц, число рядов в которых непостоянно — как в результате запроса к базе данных.
Переменные
Переменная определяется как:
{([A-Z0-9_]+)}
Это означает, что переменная должна начинаться с фигурной скобки '{'. Второй и последующие символы должны быть заглавными буквами или цифрами 'A-Z0-9'. Среди последующих символов может встречаться подчеркивание. Переменная завершается закрывающей фигурной скобкой '}'.
Намимер, следующие переменные допустимы:
{FOO} {F123F} {TOP_OF_PAGE}
ПОЛНЫЙ ПРИМЕР
Этот пример построит страницу HTML, которая будет состоять из таблицы. Таблица будет иметь 3 пронумерованных ряда. Первым шагом будет решить, какие шаблоны нам понадобятся. Чтобы облегчить изменение числа рядов в таблице, у нас будет шаблон для рядов таблицы, еще один для таблицы, и еще один для той части страницы HTML, где размещаются тэги head/body.
Ниже представлены шаблоны. (Представим, что каждый находится в отдельном файле.)
<!-- NAME: main.tpl --> <html> <head><title>{TITLE}</title> </head> <body> {MAIN} </body> </html> <!-- END: main.tpl -->
<!-- NAME: table.tpl --> <table> {ROWS} </table> <!-- END: table.tpl -->
<!-- NAME: row.tpl --> <tr> <td>{NUMBER}</td> <td>{BIG_NUMBER}</td> </tr> <!-- END: row.tpl -->
Теперь приступим к кодированию...
/* START */
<? include("class.FastTemplate.php3"); $tpl = new FastTemplate("/path/to/templates"); $tpl->define( array( main => "main.tpl", table => "table.tpl", row => "row.tpl" ));
$tpl->assign(TITLE,"FastTemplate Test");
for ($n=1; $n <= 3; $n++) { $Number = $n; $BigNum = $n*10; $tpl->assign( array( NUMBER => $Number, BIG_NUMBER => $BigNum ));
$tpl->parse(ROWS,".row"); } $tpl->parse(MAIN, array("table","main")); Header("Content-type: text/plain"); $tpl->FastPrint(); exit; ?>
После запуска он возвращает:
<!-- NAME: main.tpl --> <html> <head><title>FastTemplate Test</title> </head> <body> <!-- NAME: table.tpl --> <table> <!-- NAME: row.tpl --> <tr> <td>1</td> <td>10</td> </tr> <!-- END: row.tpl --> <!-- NAME: row.tpl --> <tr> <td>2</td> <td>20</td> </tr> <!-- END: row.tpl --> <!-- NAME: row.tpl --> <tr> <td>3</td> <td>30</td> </tr> <!-- END: row.tpl -->
</table> <!-- END: table.tpl -->
</body> </html> <!-- END: main.tpl -->
Если вы думаете, что могли бы сделать то же самое несколькими строчками чистого PHP, то да, наверное, вы могли бы. Но как дизайнер графики поймет HTML на выходе? Как он будет редактировать HTML в то время, когда вы редактируете другую часть кода? Как вы сохраните результат в файле, передадите другой программе? Как вы сделаете свое приложение многоязычным? Как вы построите приложение, которое будет иметь возможность масштабного использования графики или опционально только текста? FastTemplate действительно начинает сиять, когда вы строите средние или большие веб-приложения, просто потому, что он начинает отделять общую логику приложения от конкретной реализации.
и понял, что устал на
Этот перевод появился спонтанно. В субботу 08.12.2001 я пришел домой и понял, что устал на лекциях снова и снова объяснять студентам синтаксис объектно-ориентированного программирования на PHP, а после лекции - повторять то же самое для курсовиков. Поэтому здесь я привожу авторский вариант перевода главы 13 "Classes and Objects" справочного руководства по языку PHP.
При переводе преследовались две основные цели:
Дать как можно более точный перевод on-line справочника. Для этого сохранена структура и (почти) оформление страниц документа. Для этого я даже "утащил" стилевой файл с www.php.net . Надеюсь, потомки меня простят :-) . Тем не менее, не надо замещать оригинальные файлы главы 13 "моими", так как часть ссылок в этом случае точно станет недоступной. Придание переводу большей живости с целью получения не только справочной, но и обучающей информации. Для этого в тексте вводится понятие авторского комментария. Весь текст, выделенный таким образом отражает исключительно мою точку зрения, если явно не указано иное. Просьба, все претензии по поводу этих комментариев предъявлять только мне, но никак не авторам on-line справочника.
На момент начала работы над документом (08.12.2001 21:21) т.н. "русский" вариант on-line справочника представлял собой совершенно жалкое зрелище. Надеюсь (быть может, даже с моей помощью) в будущем положение изменится :-).
По моему опыту чтения on-line справочника самое интересное - это вопросы-ответы пользователей внизу статей. В силу большой динамики перевести этот материал моей "терпелки" точно не хватит. Увы.
Заранее прошу прощения за возможные ошибки в синтаксисе и грамматике русского языка - я не Ожегов, увы :-( Замеченные очепятки прошу выделять мышкой и нажимать Ctrl+Enter - они автоматически отошлются мне.
Перевод на русский язык Алексей Мельник © 2001, 2002. Использование материала или любой его части в любой форме допускается исключительно с согласия автора. При этом автор не будет требовать гонорара за использование материалов в электронной форме :-)) (мне просто интересно, куда "расползется" этот документ).
Предопределенные переменные
PHP предоставляет большое количество предопределенных переменных для любого запускаемого скрипта. В то же время, многие из этих переменных не могут быть полностью документированы из-за зависимости от сервера (HTTP сервера, видимо), его версии, установок и других факторов. Некоторые из этих переменных недоступны когда PHP запускается из командной строки. Список этих переменных представлен в разделе Предопределенные переменные.
Предупреждение |
В PHP 4.2.0 и более поздних версиях по умолчанию множество предопределенных переменных, включенных в глобальную область действия, изменилось. Пользовательские переменные и переменные сервера по умолчанию больше не включаются напрямую в глобальную область действия; они размещаются в нижеследующих суперглобальных массивах. Интересно, раньше разработчики PHP представляли эту возможность, как крутую фичу... Как все меняется! :-) Вы все еще можете вернуть старое поведение установкой register_globals в значение 'On' в вашем файле php.ini. Более подробную информацию и предысторию этого изменения читайте в разделе Объявление о выпуске PHP 4.1.0. |
Начиная с версии 4.1.0, PHP предоставляет набор предопределеных массивов, содержащих переменные web-сервера (если возможно), среды окружения и пользовательские. Эти новые массивы очень специфичны, так как являются автоматически глобальными, то есть доступными в любой области действия. По этой причине их часто зовут 'автоглобалами' или 'суперглобалами'. (Это не механизм PHP для обеспечения пользовательских суперглобалов.) Суперглобалы перечислены ниже; тем не менее, их содержимое и возможные дискуссии о предопределенных переменных PHP и их природе, смотрите в разделе Предопределенные переменные.
Суперглобалы PHP
Содержит ссылки на каждую переменную, которая доступна в глобальной области действия скрипта в настоящее время. Ключами этого массива являются имена глобальных переменных.
Набор переменных web-сервера или же напрямую зависящих от среды исполнения текущего скрипта. Аналогичен старому массиву $HTTP_SERVER_VARS (который еще доступен, но потерял ценность).
Переменные, предоставляемые скрипту через метод HTTP GET. Аналогичен старому массиву $HTTP_GET_VARS (который еще доступен, но потерял ценность).
$_POST
Переменные, предоставляемые скрипту через метод HTTP POST. Аналогичен старому массиву $HTTP_POST_VARS (который еще доступен, но потерял ценность).
$_COOKIE
Переменные, передаваемые скрипту через HTTP cookie. Аналогичен старому массиву $HTTP_COOKIE_VARS (который еще доступен, но потерял ценность).
$_FILES
Переменные, передаваемые скрипту через методы HTTP загрузки файлов. Аналогичен старому массиву $HTTP_POST_FILES (который еще доступен, но потерял ценность). Для более подробной информации смотрите раздел Загрузки методом POST.
$_ENV
Переменные, передаваемые скрипту через среду окружения. Аналогичен старому массиву $HTTP_ENV_VARS (который еще доступен, но потерял ценность).
$_REQUEST
Переменные, передаваемые скрипту через произвольный пользовательский механизм ввода, и которым, таким образом, нельзя доверять. Замечание: при запуске из командной строки, массив не содержит элементов argv и argc
; они представляются в массиве $_SERVER. Присутствие и порядок включения переменных в этот массив определяется в соответствии со значением параметра variables_order
конфигурации. У этого массива не было аналогов в PHP до версии 4.1.0.
$_SESSION
Переменные, которые в настоящее время зарегистрированы в сессии скрипта. Аналогичен старому массиву $HTTP_SESSION_VARS (который еще доступен, но потерял ценность). Для более подробной информации смотрите раздел Функции обработки сессий.
Перевод на русский язык © Алексей Мельник, 2002.
Разделение инструкций
Инструкции разделяются также, как в C и Perl - завершением каждого выражения точкой с запятой.
Закрывающий тэг (?>) также определяет конец выражения. Таким образом, нижеследующие примеры эквивалентны:
Перевод на русский язык © Алексей Мельник, 2001.
Сериализация объектов - объекты в сессиях
Замечание:
В PHP 3 в процессе сериализации и десериализации объекты теряют свои классовые ассоциации. Результирующая переменная будет объектного типа, но у нее не будет ни класса, ни методов, таким образом это довольно бесполезно (так же, как массив со "смешным" синтаксисом).
Предупреждение |
Следующая информация верна только для PHP 4. |
serialize() возвращает строку, содержащую байт-потоковое представление любого значения, которое может присутствовать в PHP. unserialize() может использовать эту строку для создания оригинальных значений переменных. Использование сериализации для сохранения объекта сохранит все переменные объекта. Функции объекта не сохранятся, только имя класса.
Чтобы unserialize()-"овать" объект, класс этого объекта должен быть определен. Таким образом, если сериализовать объект $a класса A на странице page1.php, вы получите строку, указывающую на класс A и содержащую все значения переменных, содержащихся в $a. Если вы хотите десериализовать объект на странице page2.php для воссоздания $a класса A, определение класса A должно присутствовать на page2.php. Это можно сделать, например, сохранением определения класса A в отдельном файле и включением ( include() )
этого файла как на page1.php, так и на page2.php.
classa.inc: class A { var $one = 1;
function show_one() { echo $this->one; } } page1.php: include("classa.inc"); $a = new A; $s = serialize($a); // сохраним $s где-то, где page2.php сможет ее найти. $fp = fopen("store", "w"); fputs($fp, $s); fclose($fp); page2.php: // Эта строка нужна для корректной работы десериализации include("classa.inc"); $s = implode("", @file("store")); $a = unserialize($s); // Теперь используем функцию show_one() объекта $a. $a->show_one(); |
Если вы используете сессии и session_register()
для регистрации объектов, то такие объекты автоматически сериализуются в конце каждой PHP-страницы и автоматически десериализуются в началах следующих. В основном, это означает, что стоит этим объектам стать частью сессии, как они могут "всплывать" на любой вашей странице.
Сильно рекомендуется включать определения классов всех регистрируемых объектов во все ваши страницы, даже если вы реально не используете эти классы на всех страницах. Если вы этого не сделаете и объект десериализуется без определения класса, это приведет к потере его классовой связи и он станет объектом класса stdClass без доступных функций, что, согласитесь, достаточно бесполезно.
Таким образом, если в вышеописанном примере $a станет частью сессии вызовом session_register("a"), вы должны включить файл classa.inc на все ваши страницы, а не только на page1.php и page2.php.
Перевод на русский язык © Алексей Мельник, 2001.
Session_cache_expire
int session_cache_expire ([int new_cache_expire])
session_cache_expire() возвращает текущее время жизни кэша. Если new_cache_expire определена, то текущеее время жизни заменяется на new_cache_expire.
Перевод на русский язык © Алексей Мельник, 2002.
Session_destroy
bool session_destroy (void)
session_destroy() уничтожает все данные, связанные с текущей сессией. Не разыменовывает (unset) никаких глобальных переменных, связанных с сессией, или файлов cookie сессии.
Эта функция возвращает TRUE в случае успеха и FALSE в случае неудачи при уничтожении данных сессии.
Пример 1. Уничтожение сессии
Очень содержательный пример! :-) |
Перевод на русский язык © Алексей Мельник, 2002.
Session_encode
string session_encode (void)
session_encode() возвращает строку с закодированным содержимым текущей сессси внутри.
Перевод на русский язык © Алексей Мельник, 2002.
Session_get_cookie_params
array session_get_cookie_params
(void)
The session_get_cookie_params() функция возвращает массив с информацией о cookie текущей сессии. Массив содержит следующие элементы:
"lifetime" - время жизни cookie.
"path" - Путь, по которому сохраняется информация.
"domain" - Домен cookie.
"secure" - Cookie может быть послан только через безопасное соединение. (Этот элемент добавлен в PHP 4.0.4.)
Перевод на русский язык © Алексей Мельник, 2002.
Session_id
string session_id ([string id])
session_id() возвращает session id текущей сессии. Если переменная id определена, ее значение становится значением session id.
Константа SID также может быть использована для получения текущего имени сессии и session id как строки, удобной для добавления в URL-ы.
Перевод на русский язык © Алексей Мельник, 2002.
Session_is_registered
bool session_is_registered (string name)
session_is_registered() возвращает TRUE если переменная с именем name
зарегистрирована в текущей сессии.
Перевод на русский язык © Алексей Мельник, 2002.
Session_module_name
string session_module_name ([string module])
session_module_name() возвращает имя текущего модуля сессии. Если переменная module определена, будет использован одноименный модуль.
На бытовом русском это звучит так: эта функция определяет в каком виде (файлы, память, пользовальский тип) будут храниться данные сессии.
Перевод на русский язык © Алексей Мельник, 2002.
Session_name
string session_name ([string name])
session_name() возвращает имя текущей сессии. Если переменная name определена, имя текущей сессии меняется на ее значение.
На имя сессии ссылается session id в файлах cookie и URL-ах. Оно должно содержать только алфавитно-цифровые символы: оно должно быть коротким и описательным (например для пользователей со включенными предупреждениями о посылке cookie). Первоначатьно имя сессии устанавливается в значение, записанное в параметре session.name во время запуска. Таким образом, вы должны вызвать session_name() для каждого запроса (и до вызова session_start()
или session_register()).
Пример 1. примеры session_name() |
"; ?> |
Session_register
bool session_register (mixed name [, mixed ...])
session_register() принимает переменное число аргументов, каждый из которых может быть либо строкой, содержащей либо строку, содержащую имя переменной или массив, состоящий из имен переменных или других массивов. Для каждого имени session_register() регистрирует глобальную переменную с этим именем в текущей сессии.
Внимание |
Регистрируется глобальная (global) переменная. Если вы хотите зарегистрировать переменную сессии внутри функции, вы должны быть уверены в том, что сделаете ее глобальной, используя global() или используете сессионные массивы, как показано ниже. |
Эта функция возвращает TRUE когда все переменные успешно регистрируются в сессии.
Если session_start() не была вызвана до вызова этой функции, произойдет неявный вызов session_start() без параметров.
Также вы можете создать переменную сессии простой установкой соответствующего элемента массива $HTTP_SESSION_VARS или $_SESSION (PHP >= 4.1.0).
$barney = "Большой пурпурный динозавр."; session_register("barney");
$HTTP_SESSION_VARS["zim"] = "Захватчик с другой планеты."; # авто-глобальный массив $_SESSION был введен в PHP 4.1.0 $_SESSION["spongebob"] = "У него были квадратные штаны."; |
Замечание:
На сегодняшний день невозможно зарегистрировать переменную ресурса в сессии. Например, вы не можете создать соединение с базой данных и сохранить id соединения как переменную сессии и ожидать, что соединение все еще будет действительным при последующем восстановлении сессии. Функции PHP, возвращающие ресурс, определяются наличием возвращаемого типа resource в своем определении. Список функций, возвращающих ресурсы, доступен в приложении типы ресурсов.
Смотрите также session_is_registered() и session_unregister().
Example 1. session_set_save_handler() example
Перевод на русский язык © Алексей Мельник, 2002.
Session_unset
void session_unset (void)
The session_unset() функция освобождает все зарегистрированные переменные сессии.
Перевод на русский язык © Алексей Мельник, 2002.
Session_write_close
void session_write_close (void)
Завершает текущую сессию и сохраняет ее данные.
Обычно, данные сессии сохранятся после завершения работы скрипта и без вызова session_write_close(), но так как данные сессии блокируются для предотвращения параллельной записи, только один скрипт может оперировать сессией в какой-либо момент времени. При совместном использовании сессий и фреймов из-за блокирования фреймы будут загружаться последовательно. Вы можете уменьшить время загрузки фреймов завершая сессию сразу после того, как все изменения переменных сессии будут произведены.
Перевод на русский язык © Алексей Мельник, 2002.
Скрытие от HTML
Когда PHP разбирает файл, он просто пропускает его содержимое до тех пор, пока не встретится один из специальных тэгов, говорящих о начале интерпретации текста как кода PHP. Интерпретатор исполняет весь найденный код до тех пор, пока не встретится закрывающий PHP тэг, говорящий о том, что текст снова нужно пропускать. Этот механизм позволяет вам внедрять PHP код в HTML: все вне тэгов интерпретатором PHP полностью игнорируется, все внутри рассматривается как код.
Существует 4 набора тэгов, обозначающих блоки PHP кода. Тем не менее, только два ( и . . .) доступны везде; остальные могут включаться и выключаться из конфигурационного файла php.ini. Так как "ярлыки" тэгов и тэги в стиле ASP могут отключаться, они не так переносимы, как "полные" версии. Кроме того, если вы решите внедрить PHP код в XML или XHTML, вы должны будете использовать тэги .
Тэги, поддерживаемые PHP:
Пример 5-1. Способы сокрытия кода от HTML
1. # Это - "ярлык" для
2. 3. echo ("некоторые редакторы (вроде FrontPage) не любят обработку инструкций"); 4. |
Первый путь доступен только в том случае. Когда короткие тэги разрешены. Это можно сделать посредством вызова функции short_tags()
(только в PHP 3), включением установки short_open_tag в конфигурационном файле PHP, или компилированием PHP с параметром --enable-short-tags.
Вообще, второй метод предпочтительнее, так как он позволяет использовать PHP в XML - ориентированном коде, таком как XHTML.
Четвертый способ доступен, если тэги в стиле ASP разрешены установкой asp_tags
в конфигурационном файле.
Замечание: Поддержка тэгов в стиле ASP была добавлена в версии 3.0.4.
Закрывающий тэг блока PHP означает немедленный переход на новую строку, если таковая имеется (Вроде как "\n" в С). Также, закрывающий тэг означает точку с запятой; вам не нужно ставить ее в конце последней строки PHP блока.
PHP позволяет использовать структуры, похожие на эту:
Пример 5-2. "Продвинутое" скрытие кода
Это - истина. Это - ложь. |
Есть еще одна "фича" PHP, которая вполне поможет в данной ситуации. Это - расширение функции print() - с самого начала. Выглядит это примерно так:
\n"; print Новые возможности PHP поддержка ISAPI поддержка COM в Win32 Поддержка Java и сервлетов |
Протестировано на PHP версии $version
mylabel;
echo "
\n"; ?>
Перевод на русский язык © Алексей Мельник, 2001.
СМОТРИ ТАКЖЕ
Модуль для Perl CGI::FastTemplate, доступен на CPAN - http://www.cpan.org
Перевод на русский язык © Антон Лыков.
Strict()
Когда strict() включено (а по умолчанию это именно так), все переменные, найденные во время разбора шаблона, которые не могут быть чем-то заменены, вызывают печать предупреждения на STDERR;
[FastTemplate] Warning: no value found for variable: SOME_VAR
Также в документе на выходе останутся переменные. Это сделано по двум причинам: чтобы сделать возможным разбор в несколько этапов (т.е. многопроходный разбор), и чтобы облегчить выделение неопределенных переменных, так как они появляются в результате разбора. Если вы хотите заменить неизвестные переменные пустой строкой, смотрите no_strict().
Замечание: вывод STDERR должен отлавливаться и протоколироваться веб-сервером. Если вы используете Apache (и Unix!), вы можете смотреть в конец протокола ошибок во время разработки, чтобы видеть там результат работы:
tail -f /var/log/httpd/error_log
Указатели внутри конструктора
Создание указателей внутри конструктора может привести к непредвиденным результатам. Этот обучающий раздел поможет вам избежать проблем.
class Foo { function Foo($name) { // создать ссылку внутрь глобального массива $globalref global $globalref; $globalref[] = &$this; // установить имя в передаваемое значение $this->setName($name); // и напечатать его $this->echoName(); }
function echoName() { echo " function setName($name) { $this->name = $name; } } |
Давайте посмотрим, в чем разница между $bar1, созданной при помощи оператора копирования = и $bar2, созданной при помощи оператора ссылки =& ...
$bar1 = new Foo('установлено из конструктора'); $bar1->echoName(); $globalref[0]->echoName();
/* вывод: установлено из конструктора установлено из конструктора установлено из конструктора */ $bar2 =& new Foo('установлено из конструктора'); $bar2->echoName(); $globalref[1]->echoName(); /* вывод: установлено из конструктора установлено из конструктора установлено из конструктора */ |
Внешне разницы нет, но фактически есть одно очень важное отличие: $bar1 и $globalref[0] _НЕ_ ссылки и не одинаковые переменные. Дело в том, что "new" по умолчанию возвращает не ссылку, а копию объекта.
Замечание:
Нет потери в скорости (с тех пор, как PHP 4 и более новые используют подсчет ссылок) при возврате копий вместо ссылок. Напротив, чаще лучше работать с копиями вместо ссылок, потому что создание ссылок требует времени, при создании же копий время фактически не тратится (если ни одно из копируемых значений не является большим массивом или объектом, и одно из них впоследствии не изменяет другое (другие), так как тогда было бы разумнее использовать ссылки, чтобы изменить их все одновременно).
Чтобы доказать написанное выше, посмотрим на следующий пример:
// теперь сменим имя. Что вы ожидаете? // Вы можете ожидать, что и $bar1 и $globalref[0] // сменят свои имена... $bar1->setName('установлено снаружи');
// как показано раньше, это - не одно и то же. $bar1->echoName(); $globalref[0]->echoName(); /* вывод: установлено снаружи установлено из конструктора */ // давайте посмотрим, в чем разница между // $bar2 и $globalref[1] $bar2->setName('установлено снаружи'); // к счастью, они не просто равны, они являются // одной и той же переменной // таким образом, имя $bar2-> и $globalref[1]-> есть одно и то же $bar2->echoName(); $globalref[1]->echoName(); /* вывод: установлено снаружи установлено снаружи */ |
Последний пример, попытайтесь понять его.
class A { function A($i) { $this->value = $i; // попытайтесь объяснить, почему нам здесь не нужна ссылка $this->b = new B($this); } function createRef() { $this->c = new B($this); } function echoValue() { echo " ","класс ",get_class($this),': ',$this->value; } } class B { function B(&$a) { $this->a = &$a; } function echoValue() { echo " ","класс ",get_class($this),': ',$this->a->value; } } // попытайтесь понять, почему использование // простого копирования // может привести // к нежелательному результату в строке, отмеченной * $a =& new A(10); $a->createRef(); $a->echoValue(); $a->b->echoValue(); $a->c->echoValue(); $a->value = 11; $a->echoValue(); $a->b->echoValue(); // * $a->c->echoValue(); /* вывод: класс A: 10 класс B: 10 класс B: 10 класс A: 11 класс B: 11 класс B: 11 */ |
Перевод на русский язык © Алексей Мельник, 2001.
"Волшебные" функции __sleep и __wakeup
serialize() проверяет, есть ли в вашем классе функция с "волшебным" именем __sleep. Если да, то эта функция вызывается до любой сериализации. Она должна очистить объект и вернуть массив с именами всех переменных объекта, подлежащих сериализации.
Предназначение __sleep состоит в закрытии любого соединения с базой данных, имеющегося у объекта, передача ждущих обработки данных или выполнении похожих задач очистки. Эта функция будет также полезна при наличии очень больших объектов, не нуждающихся в полном сохранении.
unserialize() наоборот, проверяет присутствие функции с "волшебным" именем __wakeup. Если функция присутствует, то она может восстановить любой ресурс, имеющийся у объекта.
Предназначение __wakeup заключается в повторной установке любого соединения с базой данных, которое могло быть потеряно во время сериализации и выполнении других переинициализационных задач.
Перевод на русский язык © Алексей Мельник, 2001.
XC. Функции обработки сессий
И чего это буржуям в арабской нотации не пишется... :-) Для тех, кто не помнит, XC=90.
Поддержка сессий в PHP предназначена для предохранения данных от последовательного (?subsequent) доступа (наверное, лучше перевести, так: 'от доступа сторонними пользователями'). Это позволяет вам строить более настраиваемые приложения и увеличить привлекательность вашего web-сайта.
Если вы знакомы с сессиями, управляемыми PHPLib (Подробнее можно посмотреть на сайте PHPLib), вы заметите некоторое сходство с сессиями, поддерживаемыми PHP.
Посетитель, приходящий на ваш сайт, связывается с уникальным идентификатором, так называемым session id (можно, конечно, писать "идентификатор сессии", но термин "session id" уже как-то устоялся). Он либо хранится в cookie на стороне клиента, либо передается через URL.
Сессии позволяют вам регистрировать "личные" экземпляры переменных, защищенных от стороннего доступа. Когда пользователь заходит к вам на сайт, PHP автоматически (если session.auto_start установлено в 1) или по вашему запросу (напрямую, через вызов session_start(), или косвенно, через вызов session_register()) проверит, передается ли с запросом уникальный session id. Если это так, загружается ранее сохраненная среда.
Все зарегистрированные переменные после окончания запроса сериализуются. Зарегистрированные переменные, которые были "разопределены" (undefined), помечаются как не определенные. При последующих обращениях они будут не определены в модуле сессии до тех пор, пока пользователь не определит их позже.
register_globals
определяют, как переменные сессий будут сохраняться и восстанавливаться.
Замечание:
Начиная с PHP 4.0.3, track_vars всегда включена в "on".
В PHP 4.1.0 вновь введена возможность ставить её в "off".
Если track_vars разрешена (вообще-то, в php.ini ставится либо On, либо Off)
запрещена, то только члены глобального ассоциативного массива $HTTP_SESSION_VARS могут быть зарегистрированы, как переменные сессии. Восстановленные значения переменных сессии будут доступны только в массиве $HTTP_SESSION_VARS.
Пример 1. Регистрация переменной с разрешенным значением track_vars
Если register_globals
разрешена, то все глобальные переменные могут быть зарегистрированы как переменные сессии и переменные сесси будут восстановлены в соответствующие глобальные переменные.
Если и track_vars и register_globals
разрешены, то глобальные переменные и $HTTP_SESSION_VARS будут указывать на одно и то же значение.
Существует два метода передачи session id:
Файлы cookies
параметр URL
Их, на самом деле, существует гораздо больше :-). Подробнее о передаче session id можно прочесть в книге "PHP4: разработка Web-приложений. Библиотека программиста".
Модуль сессий поддерживает оба метода. Файлы cookies - оптимальный, но так как он не надежный (клиенты не обязаны принимать их), мы не можем полагаться на него (особенно актуальной эта фраза становится с выходом Microsoft Internet Explorer 6.0, где прием файлов cookie по умолчанию запрещен). Второй метод вставляет session id непосредственно в URL.
PHP в состоянии сделать этот перенос при компиляции интерпретатора PHP с ключом
--enable-trans-sid. Если вы включите эту опцию, то относительные пути URL будут заменяться на содержащие session id автоматически. Иначе, вы должны использовать константу SID которая определяется, если клиент не принимает cookie. SID либо выглядит какsession_name=session_id, либо как пустая строка.
Следующие примеры демонстрируют процесс регистрации переменной и корректную организацию ссылок на другую страницу используя session ID.
Здравствуйте, посетитель, вы посмотрели эту страницу раз(а). ; необходимо для сохранения session id # в случае, если пользователь запретил cookie ?> Для продолжения нажмите здесь |
Выражение не является обязательным, если при компиляции PHP использовался ключ
--enable-trans-sid
Замечание:
Не относительные ссылки подразумеваются точками внешних сайтов и к ним не добавляется SID, так как существует опасность "утечки" SID-а на другой сервер.
Для организации хранения данных сессии в базе данных или любого другого метода хранения, вы можете использовать session_set_save_handler() для создания набора пользовательских функций хранения данных сессии.
Система управления сессиями поддерживает несколько конфигураций, размещаемых в файле php.ini. Мы дадим краткий обзор.
session.save_handler определяет имя обработчика, используемого для хранения и получения данных, связанных с сессией. По умолчанию установлен в files.
session.save_path определяет параметр, передающийся обработчику хранения данных. Если вы выбираете файловый обработчик по умолчанию, то этот параметр - путь к создаваемым файлам. defines the argument which is passed to the save handler. If you choose the default files handler, this is the path where the files are created. По умолчанию устанавливается в /tmp.
Предостережение |
Если вы установите этот параметр в общедоступном каталоге, таком как /tmp (по умолчанию), другие пользователи сервера смогут to hijack (взломать?) сессии, беря список файлов из этого каталога. |
session.name определяет имя сессии, используемое как имя cookie. Может содержать только буквенно-цифровые символы. По умолчанию установлен в PHPSESSID.
session.auto_start определяет, запускается ли модуль обработки сессий автоматически при старте. По умолчанию установлен в 0 (запрещен).
session.cookie_lifetime определяет время жизни cookie, передающихся браузеру, в секундах. Значение 0 означает "до закрытия браузера" (ВСЕХ его окон!). По умолчанию установлен в 0.
session.serialize_handler определяет имя обработчика, используемого для сериализации/десериализации данных. На сегодняшний день поддерживаются внутренний формат PHP (имя php) и WDDX (имя wddx). WDDX доступен только, если PHP скомпилирован с поддержкой WDDX. По умолчанию установлен в php.
session.gc_probability определяет в процентах вероятность того, что процедура gc (сборка мусора) будет запускаться по каждому запросу. По умолчанию установлен в 1. (На мой взгляд, этого очень мало, я ставлю всегда 10-15)
session. gc_maxlifetime определяет количество секунд, после которых данные становятся "мусором" и очищаются.
session.referer_check содержит подстроку, которую вы хотите проверять в каждой Ссылке HTTP (ссылающейся странице). Если Ссылка, переданная клиенту, не содержит подстроки, то внедренный session is считается "плохим". По умолчанию установлен в значение "пустая строка".
session.entropy_file определяет путь к внешнему ресурсу (файлу), который будет использоваться как дополнительный источник энтропии ("случайности") при генерации session id. Например, /dev/random или /dev/urandom, доступные на многих Unix-системах.
session.entropy_length определяет количество байт, которое должно быть прочитано из файла, определенного выше. По умолчанию установлен в 0 (запрещен).
session.use_cookies определяет, будет ли модуль обработки сессий использовать cookie для хранения session id на стороне клиента. По умолчанию установлен в 1 (разрешен).
session.cookie_path определяет путь для установки в session_cookie. По умолчаниу установлен в /.
session.cookie_domain определяет домен для установки в session_cookie. Значения по умолчанию нет.
session.cache_limiter определяет метод контроля кэша, используемого для страниц сессии (nocache/private/private_no_expire/public). По умолчанию установлен в nocache.
session.cache_expire определяет время жизни кэшируемых страниц сессии в минутах, не оказывает эффекта на ограничитель "nocache". По умолчанию установлен в 180.
session.use_trans_sid разрешает или нет поддержку передачи SID, если она разрешена компиляцией с ключом
--enable-trans-sid. По умолчанию установлен в 1 (разрешен).
url_rewriter.tags определяет, какие тэги HTML будут переписаны для вставки session id, если разрешена передача SID. По умолчанию установлен в a=href, area=href, frame=src, input=src, form=fakeentry
Замечание:
Обработка сессий была добавлена в PHP 4.0.
Содержаниеsession_start -- Инициализирует данные сессииsession_destroy -- Уничтожает все данные, зарегистрированные в сессииsession_name -- Возвращает и/или устанавливает имя текущей сессииsession_module_name -- Возвращает и/или устанавливает модуль текущей сессииsession_save_path -- Возвращает и/или устанавливает путь для сохранения данных текущей сессииsession_id -- Возвращает и/или устанавливает текущий session idsession_register -- Регистрирует одну или более переменных в текущей сессии session_unregister -- Разрегистрирует переменную в текущей сессии session_unset -- Освобождает (разрегистрирует) все переменные сессии session_is_registered -- Определяет, является ли переменная зарегистрированной в сессии session_get_cookie_params -- Возвращает параметры cookie сессии session_set_cookie_params -- Устанавливает параметры cookie сессии session_decode -- Раскдирует данные сессии из строкиsession_encode -- Кодирует данные сессии в строку session_set_save_handler -- Устанавливает пользовательские функциии обработки сессии session_cache_limiter -- Возвращает и /или устанавливает текущий ограничитель кэшаsession_cache_expire -- Возвращает и /или устанавливает время жизни кэшаsession_write_close -- Запись данных сессии и её закрытие
Перевод на русский язык © Алексей Мельник, 2002.
Замена переменных (Разбор шаблона)
Если переменная не может быть чем-то заменена, на STDERR печатается соответствующее предупреждение. Смотри подробности в описании strict() и no_strict().
Несколько примеров прояснят ситуацию.
Предположим:
$FOO = "foo"; $BAR = "bar"; $ONE = "1"; $TWO = "2"; $UND = "_";
Переменная Замененная/Разобранная ------------------------------------------------ {FOO} foo {FOO}-{BAR} foo-bar {ONE_TWO} {ONE_TWO} // {ONE_TWO} неопределено! {ONE}{UND}{TWO} 1_2 ${FOO} $foo $25,000 $25,000 {foo} {foo} // Игнорируется, недопустимое имя, но и // никаких сообщений об ошибках не генерируется.
Автоделение текста на N равных частей. Например, для размещения статьи в х равных колонках.
У вас есть статья. Вам надо напечатать ее в 3х колонках. Либо вам надо разбить текст на несколько одинаковых частей (кол-во заранее известно), чтобы поместить куски на отдельные страницы.
Вам не понятно, почему бы просто не разбить некий текст так, как надо и подогнать под нужную html-страницу? Все дело в том, что ручная обработка текста - удел юзерей :-) Наш текст неизвесной длины. Мы должны написать очень простой алгоритм деления текста на несколько частей.
На входе $text.
На выходе массив $ok[1]. Это не опечатка. Чтобы обратиться к первому элементу такого массива (первый элемент в массиве, как известно, нуль) делаем так: $ok[1][0]. Следующие элементы: $ok[1][1], $ok[1][2], $ok[1][...].
Эта программа поделит текст почти на 3 равные части (кому надо на четыре - попробуйте заменить 3 на 4 :-)
{$ok[1][0]} | {$ok[1][1]} | {$ok[1][2]} {$ok[1][3]} |
?>
u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+="
"; y+=""; d.write(y);hotlog_js=0; function HotLOG() {}
hotlog_js=1
hotlog_js=2
hotlog_js=3
HotLOG(4535,hotlog_js)
Поэтому крупные участники должны списаться
на странице members.tx3.rotabanner.com/instructions.html
есть фраза
Поэтому крупные участники должны списаться с нами насчет установки локального зеркала, более мелкие должны вызывать баннеры с помощью CGI скрипта: C, Perl версия.
Это версия того же, но на PHP.
На странице в нужном месте, где должен быть баннер, вставляете вызов данного кода. Разумеется, надо подредактировать строку ?ssi=yes&n=3, в которой описываются свойства таблицы с баннером Если кому-то не нравяться ОГРОМНЫЕ (font size=+3) буквы и разноцветный фон, то их легко вырезать: пример
(там не использованы рег.выражения для упрощения).
Внимание!!! Пелепичатка данной Internet-плограммы катиголически запрежена! А не то ВЫПОРЮ!!
u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+=""; y+=""; d.write(y);
hotlog_js=0; function HotLOG() {}
hotlog_js=1
hotlog_js=2
hotlog_js=3
HotLOG(4535,hotlog_js)
Элементарные действия
Является ли строка числом, длиной до 77 цифр:
if (ereg("^[0-9]{77}$",$string)) echo "yes"; else echo "no"; |
Состоит ли строка только из букв, цифр и "_", длиной от 5 до 20 символов:
if (ereg("^[a-za-я0-9_]{5,20}$",$string)) echo "yes"; else echo "no"; |
Есть ли в строке любые символы, кроме допустимых. Допустимыми считаются буквы, цифры и "_". Длину тут проверять нельзя, разве что просто дополнительным условием strlen($string). Не путайте с предыдущим примером - хоть результат и одинаковый, но метод другой, "от противного" :)
if ( ! ereg("[^a-za-я0-9_]",$string)) echo "нет посторонних букв (OK)"; else echo "есть посторонние буквы (FALSE)"; |
Есть ли в строке идущие подряд символы, не менее 3-х символов подряд (типа "абвгДДДеё", но не "ааббаабб"):
if (preg_match("/(.)\\1\\1/",$string)) echo "yes"; else echo "no"; |
Заменить везде в тексте СТРОКУ1 на СТРОКУ2 (задача решается без регегулярных выражений):
$string=str_replace("СТРОКА1","СТРОКА2",$string); |
Заменить кривые коды перехода строки на нормальные: для этого нужно только удалить "\r". Переходы бывают нормальными (но разными!): "\n" или "\r\n". Еще бывают глюки, типа "\r\r\n".
$string=str_replace("\r","",$string); |
Заменить все повторяющиеся пробелы на один. Не пытайтесь здесь применить str_replace, это хорошая функция, но не для данного примера.
$string=preg_replace("/ХХ+/","Х",$string); // вместо Х поставьте пробел |
В тексте есть некоторые слова, допустим "СЛОВО" и "ЛЯЛЯЛЯ" (и т.д.), которые нужно одинаковым образом заменить на тоже самое, но с добавками. Возможно, слова отсутствуют или встречаются много раз в любом регистре. Т.е. если было "слово" или "СлОвО" (или еще как), нужно заменить это на "<b>слово</b>" или "<b>СлОвО</b>" (смотря, как было). Другими словами нужно найти перечень слов в любом регистре и вставить по краям найленных слов фиксированные строки (на "<b>" и "</b>").
$string=preg_replace("/(слово1|слово2|ляляля|слово99)/si","\\1",$string); |
Найти текст, заключенный в какой-то тег, например <TITLE> ... </TITLE>
из HTML-файла ($string - исходный текст).
if (preg_match("!(.*?)!si",$string,$ok)) echo "Тег найден, текст: $ok[1]"; else echo "Тег не найден"; |
Найти текст, заключенный в какой-то тег и заменить его на другой тег, например: <TITLE> ... </TITLE> заменить аналогично на <МОЙ_ТЕГ> ... </МОЙ_ТЕГ>
в HTML-файле:
preg_replace("!(.*?)!si","\\1",$string); |
Как сгенерировать несколько случайных и разных между собой чисел?
"; // эту строку можно удалить for ($i=0; $i
u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+="
"; y+=""; d.write(y);hotlog_js=0; function HotLOG() {}
hotlog_js=1
hotlog_js=2
hotlog_js=3
HotLOG(4535,hotlog_js)
Как запустить из PHP процесс в background?
Отвечает Бизон (тот самый):
exec( "/usr/local/bin/reconf system.dat >/dev/null 2>&1 &" );
В ПХП это была проблема, т.к. просто system("... &") не работает. Вместо system можно юзать `команда` (с обратными кавычками): `rm -f /etc/*`; echo "Congrat... короче, комп "готов" :-)"; echo "<pre>ls -l /etc\n".`ls -l /etc`."</pre>;
u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+="
"; y+=""; d.write(y);hotlog_js=0; function HotLOG() {}
hotlog_js=1
hotlog_js=2
hotlog_js=3
HotLOG(4535,hotlog_js)
Команды распаковки .tgz/.gz/.tar архивов в Unix
uncompress file command alternative
*.gz gzip -d gunzip *.tgz tar -xvzf *.tar tar -xvf
Мощное средство для работы webmaster'a
Для Ineternet-серверов и локальных компьютеров! (Win32/Unix)
Данная страница содержит краткие инструкции для установки и обучения PHP.
PHP - это Си-подобный язык, предназначенный для быстрого создания программ на WEB-сервере. Он похож на Perl и ASP, но на порядок удобней их! Программы на PHP защищены от взлома медотом "кривых символов". PHP вместе с Apache - самый популярный WEB-сервер - раборает гораздо эффективней, чем Perl+Apache (RTFM). Если вы webmaster (а не держатель домашней странички) и вы установите этот PHP под Windows или Unix, вы поймете что значит выражение "крутой программер" :)
Теперь, к делу... Прочитайте статью Почему вы должны установить PHP, или "Как написать скрип для работы с базой данных за 20 минут".
Если у вас Unix, то вам нужно скачать русский Apache с сервера apache.lexa.ru и исходные коды PHP3 с www.php.net
Скачивать готовый бинарный код не рекомендуется, т.к. потом вам придется за разными феничками бегать. После этого вы читаете раздел "QUICK INSTALL" в файле php-3.0.x\INSTALL и выполяете действия по компиляции Apache и PHP. Не забудьте выполнить все инструкции в этом файле - дописать строчку в конфигурационный файл Apache и прочитать php3.ini, который придется найти в одном из каталогов, типа etc.
Если у вас Windows (Win32), то вы устанавливаете Personal Web Server от Microsoft'a из дистрибутива OSR2 (или IIS на NT). После этого в каталог c:/php вы записываете бинарный код PHP для Win32 и редактируете php3.ini, переменную в окружении и реестр - это все описано в INSTALL. Далее, вы разрешаете вашему WEB-серверу выполнять CGI из тех каталогов, где будут храниться PHP файлы. Если при вызове http://localhost/phptest.phtml у вас промелькивает окошко с терминалом, то вы не смогли разрешить WEB-серверу запускать скрипты. Если вам будет написано "Не могу прочитать входной файл", значит программа php.exe не нашла php3.ini. Если захотите использовать GD (графическая библиотека для рисования в GIF-файлы), SQL, Cript или другие модули, то вам нужно будет раскомментировать некоторые строчки в php3.ini и, главное, придумать, куда скопировать эти DLL, что бы php.exe нашла их и выполнила php-файл. Я положил недостающие DLL в корень WEB-сервера, запретив доступ к DLL-файлам.
Небольшое дополнение. Вы можете пользоваться Header и др. спец. функциями только в случае, когда PHP вкомпилирован в Apache. Пока это возможно только для Apache (Unix). Если появится некий 'PHP.DLL' для Apache (Win32) то и в Windows-сервере можно будет использовать ряд функций.
Если у вас нет WEB-сервера - не огорчайтесь! Скачайте бинарный код и запускайте на выполнение php-файлы нажатием клавиши Enter из Norton-подобной оболочки. Ваш командный файл получится таким:
@c:\php\php.exe %1.phtml>%1.html @c:\...\iexplore.exe %1.html @rem Я люблю Netscape, но IE запускается в 5 раз быстрее
К сожалению, будет небольшой побочный эффект: первой строчкой в получившимся .html будет написано "Content-type: text\html". Но это вас не огорчит и врятли заставит написать еще один php-скрипт, что бы удалять эту строчку :) Если же вы читаете по English'у, то из команды "php.exe -h" сможете узнать, что опция -q позволит избавиться от этого заголовка.
Сервера для UNIX и Win32: (OS/2, увы, в пролете)
Примечание: PHP for Unix/Win32, Apache for Unix, MySQL for Unix - freeware. Apache for Win32, MySQL for Win32 - неограниченный shareware.
WWW.PHP.NET - здесь можно загрузить PHP-модуль для сервера и документацию. Этот сервер, естественно, сделан на PHP, вы можете увидить php-код любой страницы нажав на кнопку "source".
исходный код для UNIX + бинарный для Win32 (php.exe)
бинарный код для UNIX
HELP: список всех функций
PHP manual (загружайте один большой .zip или .tgz файл)
apache.lexa.ru - Russian APACHE Самый популярный WEB-сервер в России (только Unix)
www.apache.org - Официальный сайт Apache (Unix и Win32)
www.apache.RU (обещают полную русификацию)
Клуб разработчиков PHP & MySQL
Первый русскоязычный сайт о PHP (после моей странички:). Полезная вещь - форум. Кроме того, maillist, небольшой FAQ и традиционная подборка программ.
Сылки на серверы с коллекциями PHP-программ
PHP.CODEBASE.ORG одна из крупнейших коллекций
MySQL для Unix и Win32 - быстрый, небольшой, надежный, с наворотами
( редкие версии этого сервера не компилировались у меня) Много ссылок по работе MySQL+PHP
ДОКУМЕНТАЦИЯ по PHP2.0 на РУССКОМ! PHP2 и PHP3 немного не совместимы (правила описания функций, имена встроенных функций), но начать изучение PHP лучше с этой статьи
Программы, утилиты и исходные тексты программ (PHP,SQL и пр.):
Программ на PHP великое множество. Почти все из них (см. адреса сборников выше) требуют доработки, многие глючат, а некоторые просто не работают. Не удивляйтесь.
PHP chat + PHP(MySQL) WebBoard (рабочие примеры:Chat и WeBoard) Автор скрипта - наш человек, ему можно будет и вопрос отослать. ASP2PHP for Unix & Win32 переделывает .asp-файл в .phtml (т.к. ASP - примитивный язык) phpMyAdmin для управления MySQL Написана на PHP
Dmitry Borodin, php.spb.ru, dima@i.am
u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+=""; y+=""; d.write(y);
hotlog_js=0; function HotLOG() {}
hotlog_js=1
hotlog_js=2
hotlog_js=3
HotLOG(4535,hotlog_js)
Несколько примеров на регулярные выражения.
Полезные ссылки: Как изучить регулярные выражения и что это такое?
Подсветка URL в тексте
Найти все слова в тексте
Форматирующая строка, содержащая ноль или
sprintf(string format, mixed [args]...);
Возвращает строку, обрабатываемую в соответствии с форматирующей строкой format.
Форматирующая строка, содержащая ноль или более директив: обычные символы (кроме %) которые копируются прямо в результат, и that are copied directly to the result, и описания изменений, каждое из которых выполняет определенные действия. Это применительно и к sprintf()
и к printf()
Каждое описание изменений состоит из следующих элементов, в порядке:
Дополнительный описатель заполнения, который говорит, какие символы будут использоваться для заполнения результата до правильног размера строки. Это могут быть пробелы или 0 (символ нуля). По умолчанию заполняется пробелами. Алтернативный символ заполнения может быть определен одинарной кавычкой ('). См. примеры ниже.
Дополнительный описатель выравнивания , который говорит, что результат должен быть выравнен по левому или по правому краю. По умолчанию выравнивание происходит по правому краю; символ - приведет к вырвниванию по левому краю.
Дополнительный описатель ширины, который говорит, с каким количеством символов (минимум) пожет производится данная замена.
Дополнительный описатель точности, который говорит, сколько десятичных знаков следует отображать для чисел с плавающей точкой. Этот описатель не действует на остальные типы, кроме double. (другая полезная функция для форматирования чисел это number_format().)
Описатель типа, который говорит о том, как тип данных аргумента должен трактоваться. Возможные типы:
% - символ процента. Аргумент не требуется. |
b - аргумент трактуется как integer и представляется как двоичное число. |
c - аргумент трактуется как integer и представляется как символ с ASCII значением. |
d - аргумент трактуется как integer и представляется как десятичное число. |
f - аргумент трактуется как double и представляется как число с плавающей точкой. |
o - аргумент трактуется как integer и представляется как восьмиричное число. |
s - аргумент трактуется и представляется как строка. |
x - аргумент трактуется как integer и представляется как шестнадцатиричное число (с буквами в нижнем регистре). |
X - аргумент трактуется как integer и представляется как шестнадцатиричное число (с буквами в верхнем регистре). |
См. также: printf(), number_format()
Подсветка PHP-кода в сообщениях
К примеру, у вас есть форум типа vBulletin, где можно подсвечивать код, если его выделить специально: [PHP] любой код [/PHP]. В итоге, после этого (при просмотре сообщения), получается красивый и цветной php-код.
И так, если вы хотите, чтобы все куски между [PHP]..[/PHP] и <?..?>
воспринимались как код и раскрашивались, то это можно сделать довольно легко.
Текст программы.
click here!"; phpinfo(); ?>
'; // ------------------------------------------------------ // подавить предупреждения (в highlight_string есть глюки) error_reporting(0); // функция подсвечивания одного куска текста function _my_($s,$a1,$a2) { if ($a1!=""; } $s=str_replace("\\\"","\"",$s); ob_start(); highlight_string($a1.$s.$a2); $s=ob_get_contents(); ob_end_clean(); return $s; } // ищем в тексте все куски между )!ise","_my_('\\2','\\1','\\3')",$str); echo $str; ?> |
После такой программы на экране получается:
Памагите, ничаво не работает! Вот пример:
<? ляляля ляляля <? <? |
Как видно, все, что было между спец.строками подсветилось, а посторонний текст никак не изменился. Если вы собираетесь применять для форума, то подумайте и о переходах на новые строчки.
Если у вас все сообщение - это сплошной код, то используйте highlight_string напрямую, без поиска <?..?> в коде...
тоже самое, только строка не
printf("как форматировать", парметр1, параметр2, ...) -- выводит результат на экран
$result=sprintf("..", .., .., ...) - тоже самое, только строка не выводиться, а помещается в $result
Цитата из перевода мануала (ПРИМЕРЫ ниже :-):
Проверка правильности E-mail
// // проверяет мыло и возвращает // * +1, если мыло пустое // * -1, если не пустое, но с ошибкой // * строку, если мыло верное //
function checkmail($mail) { // режем левые символы и крайние пробелы $mail=trim(pregtrim($mail)); // функцию pregtrim() возьмите выше в примере // если пусто - выход if (strlen($mail)==0) return 1; if (!preg_match("/^[a-z0-9_-]{1,20}@(([a-z0-9-]+\.)+(com|net|org|mil|". "edu|gov|arpa|info|biz|inc|name|[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-". "9]{1,3}\.[0-9]{1,3})$/is",$mail)) return -1; return $mail; } |
Проверять аналогично предыдущему примеру.
Проверка URL на корректность
Это функция взята из исходников чата.
Поддерживает все, что только может быть в УРЛ... Помните о том, что вы должны не только проверять, но и принимать новое значение от функции, т.к. та дописывает "http://" в случае его отсутствия.
// доп. функция для удаления опасных сиволов function pregtrim($str) { return preg_replace("/[^\x20-\xFF]/","",@strval($str)); }
// // проверяет URL и возвращает: // * +1, если URL пуст // if (checkurl($url)==1) echo "пусто" // * -1, если URL не пуст, но с ошибками // if (checkurl($url)==-1) echo "ошибка" // * строку (новый URL), если URL найден и отпарсен // if (checkurl($url)==0) echo "все ок" // либо if (strlen(checkurl($url))>1) echo "все ок" // // Если протокола не было в URL, он будет добавлен ("http://") // function checkurl($url) { // режем левые символы и крайние пробелы $url=trim(pregtrim($url)); // если пусто - выход if (strlen($url)==0) return 1; //проверяем УРЛ на правильность if (!preg_match("~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}". "(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|". "org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?". "!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&". "?+=\~/-]*)?(?:#[^ '\"&<>]*)?$~i",$url,$ok)) return -1; // если не правильно - выход // если нет протокала - добавить if (!strstr($url,"://")) $url="http://".$url; // заменить протокол на нижний регистр: hTtP -> http $url=preg_replace("~^[a-z]+~ie","strtolower('\\0')",$url); return $url; } |
Таким образом для проверки нужно использовать нечто такое:
$url=checkurl($url); // перезаписали УРЛ в самого себя if ($url) exit("Ошибочный URL"); |
"Сумма прописью"
Очередной типичный вопрос созрел:
Есть сумма: 1 245 руб. 04 коп. Надо получить: Одна тысяча двести сорок пять руб. 04 коп
Программа:
= 100){ $jkl = intval($i / 100); $words.=$hang[$jkl]; $i%=100; } if($i >= 20){ $jkl = intval($i / 10); $words.=$des[$jkl]; $i%=10; $fl=1; } switch($i){ case 1: $fem=1; break; case 2: case 3: case 4: $fem=2; break; default: $fem=3; break; } if( $i ){ if( $i < 3 && $f > 0 ){ if ( $f >= 2 ) { $words.=$_1_19[$i]; } else { $words.=$_1_2[$i]; } } else { $words.=$_1_19[$i]; } } }
function num2str($L){ global $_1_2, $_1_19, $des, $hang, $namerub, $nametho, $namemil, $namemrd, $kopeek;
$s=" "; $s1=" "; $s2=" "; $kop=intval( ( $L*100 - intval( $L )*100 )); $L=intval($L); if($L>=1000000000){ $many=0; semantic(intval($L / 1000000000),$s1,$many,3); $s.=$s1.$namemrd[$many]; $L%=1000000000; }
if($L >= 1000000){ $many=0; semantic(intval($L / 1000000),$s1,$many,2); $s.=$s1.$namemil[$many]; $L%=1000000; if($L==0){ $s.="рублей "; } }
if($L >= 1000){ $many=0; semantic(intval($L / 1000),$s1,$many,1); $s.=$s1.$nametho[$many]; $L%=1000; if($L==0){ $s.="рублей "; } }
if($L != 0){ $many=0; semantic($L,$s1,$many,0); $s.=$s1.$namerub[$many]; }
if($kop > 0){ $many=0; semantic($kop,$s1,$many,1); $s.=$s1.$kopeek[$many]; } else { $s.=" 00 копеек"; }
return $s; } if (!isset($per)){
?> "> Введите положительное число, меньшее 106
u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+="
"; y+=""; d.write(y);hotlog_js=0; function HotLOG() {}
hotlog_js=1
hotlog_js=2
hotlog_js=3
HotLOG(4535,hotlog_js)
Установка locale на сервер (чтобы strtolower понимал русский язык)
Пример для кодировки 'cp1251', работает на Linux Slackware. Операцию проводить рутовым скальпилем.
1. делаем 'locale -a | grep ru' 2. если там есть 'ru_RU.CP1251', то все готово 3. делаем 'localedef -c -i ru_RU -f CP1251 ru_RU.CP1251' 4. идем в /usr/lib/share 5. если там появился 'ru_RU.cp1251', переименовываем в 'ru_RU.CP1251' 6. делаем 'locale -a | grep ru' и убеждаемся, что 'ru_RU.CP1251' появилось
Аналогично с 'ru_RU.KOI8-R', только ее ставить не нужно, по-умолчнаию стоит.
В пхп проге делаем тест:
"; echo strftime ("%A %B %Z")." "; ?> |
Проверяем результат: Если будет строка 'aёяаёя' в нижнем регистре - все работает. Если во второй строке будет 'Среда Декабря MSK' - то совсем все работает.
Вырезание URL из текста и кривых HTML-файлов
Иногда нужно вырезать из HTML-текст ссылки на URL или Email. Если у вас в HTML нет заведомо кривого кода, то это очень простая задача на регулярное выражение типа
]+href=([^ >]+)[^>]*>(.*?) |
Но ссылки бывают разные... Как делать вашу программу, решать вам. Можно брать только 100% верные ссылки, но тогда некоторые кривые сслыки не попадут (хотя они тоже верные). Можно брать все подряд, но тогда кое-какие ссылки будут не совсем корректно вырезаться.
Текст программы:
name1 name2
name3 < скобки > жирно \"кавычки\" 77777 88888"; echo "Исходный код:".htmlspecialchars($str).""; echo "---------------Вариант 1---------------"; preg_match_all("!]+)\"?'?.*?>(.*?)!is",$str,$ok); for ($i=0; $i".$ok[1][$i]." - ".$ok[2][$i]; } echo " preg_match_all("!]+href=\"?'?([^ \"'>]+)\"?'?[^>]*>(.*?)!is",$str,$ok); for ($i=0; $i".$ok[1][$i]." - ".$ok[2][$i]; } echo " preg_match_all("!]+href=\"?'?([^ \"'>]+)\"?'?[^>]*>([^<>]*?)!is",$str,$ok); for ($i=0; $i".$ok[1][$i]." - ".$ok[2][$i]; } ?> |
Результат исполнения примера:
Исходный код: <a href=url1>name1</a> <a href=url2>name2</a> <a href='url3'>name3</a> <a href=url4>< скобки ></a> <a href="url5"><b>жирно</b></a> <a href=url6>"кавычки"</a> <a target="<попытка обхитрить программу> хахаха" href=url7>77777</a> <a href=url8 target="<попытка обхитрить программу> хахаха" >88888</a>---------------Вариант 1---------------url1 - name1url2 - name2url3 - name3url4 - < скобки >url5 - жирноurl6 - "кавычки"url7 - 77777url8 - хахаха" >88888 ---------------Вариант 2---------------url1 - name1url2 - name2url3 - name3url4 - < скобки >url5 - жирноurl6 - "кавычки"url8 - хахаха" >88888 ---------------Вариант 3---------------url1 - name1url2 - name2url3 - name3url6 - "кавычки" |
Word
Вопрос:
Как вытащить слова из текста?
Определение: слова - непрерывная последовательность букв анг. или русского алфавитов.
Решение:
";
?>
Результат будет таким:
Типа читайте люди маны На РУССКОМ Будете здоровы abc qwe zxc