СтатьиСтроки и регулярные выражения в PHP
ВведениеВозможности эффективной организации, поиска и распространения информации давно представляли интерес для специалистов в области компьютерных технологий. Поскольку информация в основном представляет собой текст, состоящий из алфавитно-цифровых символов, разработка средств поиска и обработки информации по шаблонам, описывающим текст, стала предметом серьезных теоретических исследований. Поиск по шаблону позволяет не только находить определенные фрагменты текста, но и заменять их другими фрагментами. Одним из стандартных примеров поиска по шаблону являются команды поиска/замены в текстовых редакторах - например, в MS Word, Emacs и в моем любимом редакторе vi. Всем пользователям UNIX хорошо известны такие программы, как sed, awk и grep; богатство возможностей этих программ в значительной степени обусловлено средствами поиска по шаблону. Механизмы поиска по шаблону решают четыре основные задачи:
Появление Web породило необходимость в более быстрых и эффективных средствах поиска данных, которые бы позволяли пользователям со всего мира находить нужную информацию среди миллиардов web-страниц. Поисковые системы, онлайновые финансовые службы и сайты электронной коммерции — все это стало бы абсолютно бесполезным без средств анализа гигантских объемов данных в этих секторах. Действительно, средства обработки строковой информации являются жизненно важной составляющей практически любого сектора, так или иначе связанного с современными информационными технологиями. В этой главе основное внимание посвящено средствам обработки строк в РНР. Мы рассмотрим некоторые стандартные строковые функции (в языке их больше 60!), а из приведенных определений и примеров вы получите сведения, необходимые для создания web-приложений. Но прежде чем переходить к специфике РНР, я хочу познакомить вас с базовым механизмом, благодаря которому становится возможным поиск по шаблону. Речь идет о регулярных выражениях. Регулярные выражения
Регулярные выражения лежат в основе всех современных технологий поиска по шаблону. Регулярное выражение представляет собой последовательность простых и служебных символов, описывающих искомый текст. Иногда регулярные выражения бывают простыми и понятными (например, слово В РНР существуют два семейства функций, каждое из которых относится к определенному типу регулярных выражений: в стиле POSIX или в стиле Perl. Каждый тип регулярных выражений обладает собственным синтаксисом и рассматривается в соответствующей части главы. На эту тему были написаны многочисленные учебники, которые можно найти как в Web, так и в книжных магазинах. Поэтому я приведу лишь основные сведения о каждом типе, а дальнейшую информацию при желании вы сможете найти самостоятельно. Если вы еще не знакомы с принципами работы регулярных выражений, обязательно прочитайте краткий вводный курс, занимающий всю оставшуюся часть этого раздела. А если вы хорошо разбираетесь в этой области, смело переходите к следующему разделу. Синтаксис регулярных выражений (POSIX)Структура регулярных выражений POSIX чем-то напоминает структуру типичных математических выражений - различные элементы (операторы) объединяются друг с другом и образуют более сложные выражения. Однако именно смысл объединения элементов делает регулярные выражения таким мощным и выразительным средством. Возможности не ограничиваются поиском литерального текста (например, конкретного слова или числа); вы можете провести поиск строк с разной семантикой, но похожим синтаксисом — например, всех тегов HTML в файле.
Простейшее регулярное выражение совпадает с одним литеральным символом — например, выражение
Оператор Квадратные скобки
Квадратные скобки (
Конечно, перечисленные выше интервалы всего лишь демонстрируют общий принцип. Например, вы можете воспользоваться интервалом Квантификаторы
Существует особый класс служебных символов, обозначающих количество повторений отдельного символа или конструкции, заключенной в квадратные скобки. Эти служебные символы (
Прочие служебные символы
Служебные символы
Объединение служебных символов приводит к появлению более сложных выражений. Рассмотрим несколько примеров:
Иногда требуется найти служебные символы в строках вместо того, чтобы использовать их в описанном специальном контексте. Для этого служебные символы экранируются обратной косой чертой ( Стандартные интервальные выражения (символьные классы)
Для удобства программирования в стандарте POSIX были определены некоторые стандартные интервальные выражения, также называемые символьными классами (
Функции РНР для работы с регулярными выражениями (POSIX-совместимые)В настоящее время РНР поддерживает семь функций поиска с использованием регулярных выражений в стиле POSIX:
Описания этих функций приведены в следующих разделах. ereg( )
Функция int ereg (string шаблон, string строка [, array совпадения])
Поиск производится с учетом регистра алфавитных символов. Пример использования $is_com = ereg("(\.)(com$)", $email);
Функция возвращает
Обратите внимание: из-за присутствия служебного символа
Необязательный параметр $url = "http://www.apress.com"; // Разделить $url на три компонента: "http://www". "apress" и "com" $www_url = ereg("^(http://www)\.([[:alnum:]+\.([[:alnum:]]+)". $url, $regs); if ($www_url) { // Если переменная $www_url содержит URL echo $regs[0]; // Вся строка "http://www.apress.com" echo "<br/>"; echo $regs[l]; // "http://www" echo "<br/>"; echo $regs[2]; // "apress" echo "<br/>"; echo $regs[3]; // "com" } При выполнении сценария будет получен следующий результат: http://www.apress.com http://www apress com ereg_replace( )
Функция string ereg_replace (string шаблон, string замена, string строке)
Функция $copy_date = "Copyright 1999": $copy_date = ereg_replace("([0-9]+)". "2000", $copy_date); print $copy_date: // Выводится строка "Copyright 2000"
У средств поиска с заменой в языке РНР имеется одна интересная возможность - возможность использования обратных ссылок на части основного выражения, заключенные в круглые скобки. Обратные ссылки похожи на элементы необязательного параметра-массива совпадения функции $url = "Apress (http://www.apress.com)"; $url = ereg_replace("http://(([A-Za-z0-9.\-])*)", "<a href=\"\\0\">\\0</a>", $url); print $url; Выводится строка: Apress (<a href="http://www.apress.com">http://www.apress.com</a>) eregi( )Функция eregi( ) ищет в заданной строке совпадение для шаблона. Синтаксис функции eregi( ): int eregi (string шаблон, string строка [, array совпадения])
Поиск производится без учета регистра алфавитных символов. Функция $password = "abc"; if (! eregi("[[:alnum:]]{8.10}, $password) { print "Invalid password! Passwords must be from 8 through 10 characters in length."; } // В результате выполнения этого фрагмента выводится сообщение об ошибке. // поскольку длина строки "abc" не входит в разрешенный интервал // от 8 до 10 символов. eregi_replace( )
Функция string eregi_replace (string шаблон, string замена, string строка) split( )
Функция array split (string шаблон, string строка [, int порог])
Необязательный параметр порог определяет максимальное количество элементов, на которые делится строка слева направо. Если шаблон содержит алфавитные символы, функция $ip = "123.345.789.000"; // Канонический IP-адрес $iparr = split ("\.", $ip) // Поскольку точка является служебным символом. // ее необходимо экранировать. print "$iparr[0] <br/>"; // Выводит "123" print "$iparr[1] <br/>"; // Выводит "456" print "$iparr[2] <br/>"; // Выводит "789" print "$iparr[3] <br/>"; // Выводит "000" spliti( )
Функция array spliti (string шаблон, string строка [, int порог])
Разумеется, регистр символов важен лишь в том случае, если шаблон содержит алфавитные символы. Для других символов выполнение sql_regcase( )
Вспомогательная функция string sql_regcase (string строка)
Если алфавитный символ существует в двух вариантах (верхний и нижний регистры), выражение в квадратных скобках будет содержать оба варианта; в противном случае исходный символ повторяется дважды. Функция $version = "php 4.0"; print sql_regcase($version); // Выводится строка [Pp][Hh][Pp][ ][44][..][00] Синтаксис регулярных выражений в стиле PerlPerl давно считается одним из самых лучших языков обработки текстов. Синтаксис Perl позволяет осуществлять поиск и замену даже для самых сложных шаблонов. Разработчики РHР сочли, что не стоит заново изобретать уже изобретенное, а лучше сделать знаменитый синтаксис регулярных выражений Perl доступным для пользователей РНР. Так появились функции для работы с регулярными выражениями в стиле Perl. Диалект регулярных выражений Perl не так уж сильно отличается от диалекта POSIX. В сущности, синтаксис регулярных выражений Perl является отдаленным потомком реализации POSIX, вследствие чего синтаксис POSIX почти совместим с функциями регулярных выражений стиля Perl. Оставшаяся часть этого раздела будет посвящена краткому знакомству с диалектом регулярных выражений Perl. Рассмотрим простой пример: /food/
Обратите внимание: строка /fo+/
Этот шаблон совпадает с последовательностью /fo{2,4}/
Шаблон совпадает с символом В регулярных выражениях Perl могут использоваться все квантификаторы, упомянутые в предыдущем разделе для регулярных выражений POSIX. Метасимволы
Одной из интересных особенностей Perl является использование метасимволов при поиске. Метасимвол [Следует отметить, что авторское толкование термина "метасимвол" противоречит не только всем традициям, по и официальной документации РНР. — Примеч. перев.] представляет собой алфавитный символ с префиксом /([d]+)000/
Комбинация /<([\w]+)>/
Этот шаблон совпадает с конструкциями, заключенными в угловые скобки, - например, тёгами HTML. Кстати, метасимвол
Еще один полезный метасимвол, /sa\b/
Поскольку метасимвол границы слова расположен справа от текста, этот шаблон совпадет в строках /sa\B/ Шаблон совпадает в таких строках, как sand и Sally, но не совпадает в строке salsa. Модификаторы
Модификаторы заметно упрощают работу с регулярными выражениями. Впрочем, модификаторов много, и в таблице приведены лишь наиболее интересные из них. Модификаторы перечисляются сразу же после регулярного выражения - например,
Функции РНР для работы с регулярными выражениями (Perl-совместимые)В РНР существует пять функций поиска по шаблону с использованием Perl-совместимых регулярных выражений:
preg_match( )
Функция int preg_match (string шаблон, string строка [, array совпадения})
При передаче необязательного параметра $linе = "Vi is the greatest word processor ever created!"; // Выполнить поиск слова "Vi" без учета регистра символов: if (preg_match("/\bVi\b\i", $line, $matcn)) { print "Match found!"; } // Команда if в этом примере возвращает TRUE preg_match_all( )
Функция int preg_match_all (string шаблон, string строка, array совпадения [, int порядок])
Порядок сохранения в массиве совпадения текста, совпавшего с подвыражениями, определяется необязательным параметром
Следующий пример показывает, как при помощи функции $user_info = "Name: <b>Rasmus Lerdorf</b> <br/> Title: <b>PHP Guru</b>"; preg_match_all ("/<b>(.*)<\/b>/U", Suserinfo. $pat_array); print $pat_array[0][0]." <br/> ".pat_array[0][l]."\n": Результат: Rasmus Lerdorf PHP Guru preg_replace( )
Функция mixed preg_replace (mixed шаблон, mixed замена, mixed строка [, int порог])
Необязательный параметр preg_split( )
Функция array preg_split (string шаблон, string строка [, int порог [, int флаги]])
Необязательный параметр порог определяет максимальное количество элементов, на которые делится строка. В следующем примере функция $user_info="+wj+++Gilmore+++++wjgi]more@hotmail.com +++++++Columbus+++OH"; $fields = preg_split("/\+{1.}/", $user_info); while ($x < sizeof($fields)) { print $fields[$x]. "<br/>"; $x++; } Результат: WJ Gilmore wjgilmore@hotmail.com Columbus OH preg_grep( )
Функция array preg_grep (string шаблон, array массив)
Пример использования функции $foods = array ("pasta", "steak", "fish", "potatoes"); // Поиск элементов, начинающихся с символа "р", // за которым следует один или несколько символов $p_foods = preg_grep("/p(\w+)/", $foods): $х = 0; while ($x < sizeof($p_foods)) { print $p_foods[$x]. "<br/>"; $x++; } Результат: pasta potatoes Другие строковые функцииКроме функций для работы с регулярными выражениями, описанными в первой части этой главы, в РНР существует более 70 функций для выполнения практически всех мыслимых операций со строками. Подробное перечисление и описание всех функций выходит за рамки этой книги и приведет к обычному повторению информации, приведенной в документации РНР. По этой причине я превратил оставшуюся часть главы в своего рода список FAQ из вопросов, часто встречающихся во многих электронных конференциях РНР и на многих сайтах этой тематики. На мой взгляд, этот способ позволяет гораздо эффективнее описать общие принципы громадной библиотеки строковых функций РНР. Дополнение и сжатие строкВ процессе форматирования часто возникает необходимость в изменении длины строки посредством дополнения или удаления символов. В РНР существует несколько функций, предназначенных для решения этой задачи. chop( )
Функция string chop(string строка)
В следующем примере функция $header = "Table of Contents\n\n"; $header = chop($header); // $header = "Table of Contents" str_pad( )
Функция string str_pad (string строка, int длина_дополнения [, string дополнение [, int тип_дополнения]])
Если необязательный параметр дополнение не указан, строка дополняется пробелами. В противном случае строка дополняется заданными символами. По умолчанию строка дополняется справа; тем не менее, вы можете передать в параметре $food = "salad"; print str_pad ($food, 5): // Выводит строку "salad
В следующем примере используются необязательные параметры функции $header = "Table of Contents"; print str_pad ($header, 5, "=+=+=", STR_PAD_BOTH); // В браузере выводится строка =+=+= Таbе of Contents=+=+=" trim( )
Функция string trim (string строка) К числу удаляемых пропусков относятся и специальные символы \n, \r, \t, \v и \0. ltrim( )
Функция string ltrim (string строка) Функция удаляет те же специальные символы, что и функция Определение длины строки
Длину строки в символах можно определить при помощи функции int strlen (string строка)
Следующий пример демонстрирует определение длины строки функцией $string = "hello"; $length = strlen($string); // $length = 5 Сравнение двух строкСравнение двух строк принадлежит к числу важнейших строковых операций любого языка. Хотя эту задачу можно решить несколькими разными способами, в РНР существуют четыре функции сравнения строк:
strcmp( )
Функция int strcmp (string строка1, string строка2)
После завершения сравнения
В следующем фрагменте сравниваются две одинаковые строки: $sthng1 = "butter"; $string2 = "butter"; if ((strcmp($string1. $string2)) == 0) { print "Strings are equivalent!"; } // Команда if возвращает TRUE strcasecmp( )
Функция int strcasecmp (string cтpoкa1, string строка2) В следующем фрагменте сравниваются две одинаковые строки: $string1 = "butter"; $string2 = "Butter"; if ((strcmp($string1, $string2)) == 0) { print "Strings are equivalent!"; } // Команда if возвращает TRUE strspn( ) Функция strspn( ) возвращает длину первого сегмента строки1, содержащего символы, присутствующие в строке2. Синтаксис функции strspn( ): int strspn (string строка1, string строка2) Следующий фрагмент показывает, как функция strspn( ) используется для проверки пароля: $password = "12345"; if (strspn($password, "1234567890") != strlen($password)) { print "Password cannot consist solely of numbers!"; } strcspn( ) Функция strcspn( ) возвращает длину первого сегмента строки1, содержащего символы, отсутствующие в строке2. Синтаксис функции strcspn( ): int strcspn (string строка1, string строка2) В следующем фрагменте функция strcspn( ) используется для проверки пароля: $password = "12345"; if (strcspn($password, "1234567890") == 0) { print "Password cannot consist solely of numbers!"; } Обработка строковых данных без применения регулярных выраженийПри обработке больших объемов информации функции регулярных выражений сильно замедляют выполнение программы. Эти функции следует применять лишь при обработке относительно сложных строк, в которых регулярные выражения действительно необходимы. Если же анализ текста выполняется по относительно простым правилам, можно воспользоваться стандартными функциями РНР, которые заметно ускоряют обработку. Все эти функции описаны ниже. strtok( ) Функция strtok( ) разбивает строку на лексемы по разделителям, заданным вторым параметром. Синтаксис функции strtok( ): string strtok (string строка, string разделители) У функции strtok( ) есть одна странность: чтобы полностью разделить строку, функцию необходимо последовательно вызвать несколько раз. При очередном вызове функция выделяет из строки следующую лексему. При этом параметр строка задается всего один раз - функция отслеживает текущую позицию в строке до тех пор, пока строка не будет полностью разобрана на лексемы или не будет задан новый параметр строка. Следующий пример демонстрирует разбиение строки по нескольким разделителям: $info = "WJ Gi1more:wjgilmore@hotmail.com | Columbus, Ohio"; // Ограничители - двоеточие (:), вертикальная черта (|) и запятая (,) $tokens = ":|,"; $tokenized = strtok($info, $tokens); // Вывести элементы массива $tokenized while ($tokenized) { echo "Element = ".$tokenized."<br/>"; // Обратите внимание: при последующих вызовах strtok // первый аргумент не передается $tokenized = strtok($tokens); }; Результат: Element = WJGilmore Element = wjgilmore@hotmail.com Element = Columbus Element = Ohio parse_str( ) Функция parse_str( ) выделяет в строке пары <переменная-значение> и присваивает значения переменных в текущей области видимости. Синтаксис функции parse_str( ): void parse_str (string строка) Функция parse_str( ) особенно удобна при обработке URL, содержащих данные форм HTML или другую расширенную информацию. В следующем примере анализируется информация, переданная через URL. Строка представляет собой стандартный способ передачи данных между страницами либо откомпилированных в гиперссылке, либо введенных в форму HTML: $url = "fname=wj&lname=gilmore&zip=43210"; parse_str($url); // После выполнения parse_str( ) доступны следующие переменные: // $fname = "wj": // $lname = "gilmore"; // $zip = "43210" Поскольку эта функция создавалась для работы с URL, она игнорирует символ амперсанд (&). explode( ) Функция explode( ) делит строку на элементы и возвращает эти элементы в виде массива. Синтаксис функции explode( ): array explode (string разделитель, string строка [, int порог]) Разбиение происходит по каждому экземпляру разделителя, причем количество полученных фрагментов может ограничиваться необязательным параметром порог. Разделение строки функцией explode( ) продемонстрировано в следующем примере: $info = "wilson | baseball | indians"; $user = explode("|", $info); // $user[0] = "wilson"; // $user[1] = "baseball"; // $user[2] = "Indians"; Функция explode( ) практически идентична функции регулярных выражений POSIX split( ), описанной выше. Главное различие заключается в том, что передача регулярных выражений в параметрах допускается только при вызове split( ). implode( ) Если функция explode( ) разделяет строку на элементы массива, то ее двойник - функция implode( ) - объединяет массив в строку. Синтаксис функции implode( ): string implode (string разделитель, array фрагменты) Формирование строки из массива продемонстрировано в следующем примере: $ohio_cities = array ("Columbus", "Youngstown", "Cleveland", "Cincinnati"); $city_string = implode("|", $ohio_cities); // $city_string = "Columbus | Youngstown | Cleveland | Cincinnati"; У implode( ) имеется псевдоним - функция join( ). strpos( ) Функция strpos( ) находит в строке первый экземпляр заданной подстроки. Синтаксис функции strpos( ): int strpos (string строка, string подстрока [, int смещение]) Необязательный параметр offset задает позицию, с которой должен начинаться поиск. Если подстрока не найдена, strpos( ) возвращает FALSE. В следующем примере определяется позиция первого вхождения даты в файл журнала: $log = " 206.169.23.11:/www/:2000-08-10 206.169.23.11:/www/logs/:2000-02-04 206.169.23.11:/www/img/:1999-01-31"; // В какой позиции в журнале впервые встречается 1999 год? $pos = strpos($log, "1999"); // $pos = 95. поскольку первый экземпляр "1999" // находится в позиции 95 строки, содержащейся в переменной $log strrpos( ) Функция strrpos( ) находит в строке последний экземпляр заданного символа. Синтаксис функции strrpos( ): int strpos (string строка, char символ) По возможностям эта функция уступает своему двойнику - функции strpos( ), поскольку она позволяет искать только отдельный символ, а не всю строку. Если во втором параметре strrpos( ) передается строка, при поиске будет использован только ее первый символ. str_replace( ) Функция str_replace( ) ищет в строке все вхождения заданной подстроки и заменяет их новой подстрокой. Синтаксис функции str_replace( ): string str_replace (string подстрока, string замена, string строка) Функция substr_replace( ), описанная ниже в этом разделе, позволяет провести замену лишь в определенной части строки. Ниже показано, как функция str_replace( ) используется для проведения глобальной замены в строке. Если подстрока ни разу не встречается в строке, исходная строка не изменяется: $favorite_food = "My favorite foods are ice cream and chicken wings"; $favorite_food = str_replace("chicken_wings", "pizza", $favohte_food); // $favorite_food = "My favorite foods are ice cream and pizza" strstr( ) Функция strstr( ) возвращает часть строки, начинающуюся с первого вхождения заданной подстроки. Синтаксис функции strstr( ): string strstr (string строка, string подстрока) В следующем примере функция strstr( ) используется для выделения имени домена из URL: $url = "http://www.apress.com"; $domain - strstr($url, "."); // $domain = ".apress.com" substr( ) Функция substr( ) возвращает часть строки, начинающуюся с заданной начальной позиции и имеющую заданную длину. Синтаксис функции substr( ): string substr (string строка, int начало [, int длина]) Если необязательный параметр длина не указан, считается, что подстрока начинается с заданной начальной позиции и продолжается до конца строки. При использовании этой функции необходимо учитывать четыре обстоятельства:
Помните о том, что параметр начало определяет смещение от первого символа строки; таким образом, возвращаемая строка в действительности начинается с символа с номером ( Следующий пример демонстрирует выделение части строки функцией substr( ): $car = "1944 Ford"; Smodel = substr($car, 6); // Smodel = "Ford" Пример с положительным параметром $car = "1944 Ford"; $model = substr($car, 0, 4); // $model = "1944" Пример с отрицательным параметром $car = "1944 Ford"; $model = substr($car, 2, -5); // $model = "44" substr_count( ) Функция substr_count( ) возвращает количество вхождений подстроки в заданную строку. Синтаксис функции substr_count( ): int substr_count (string строка, string подстрока) В следующем примере функция substr_count( ) подсчитывает количество вхождений подстроки ain: $tng_twist = "The rain falls mainly on the plains of Spain"; $count = substr_count($tng_twist, "ain"); // $count = 4 substr_replace( ) Функция substr_replace( ) заменяет часть строки, которая начинается с заданной позиции. Если задан необязательный параметр длина, заменяется фрагмент заданной длины; в противном случае производится замена по всей длине заменяющей строки. Синтаксис функции substr_replace( ): string substr_replace (string строка, string замена, int начало [, int длина])
Параметры
Простая замена текста функцией substr_replace( ) продемонстрирована в следующем примере: $favs = " 's favorite links"; $name = "Alessia"; // Параметры "0, 0" означают, что заменяемый фрагмент начинается // и завершается в первой позиции строки. $favs = substr_replace($favs, $name, 0, 0); print $favs; Результат: Alessia's favorite links Преобразование текста в HTMLБыстрое преобразование простого текста к формату web-браузера - весьма распространенная задача. В ее решении вам помогут функции, описанные в этом разделе. nl2br( )
Функция nl2br( ) заменяет все символы новой строки (\n) эквивалентными конструкциями HTML string nl2br (string строка) Символы новой строки могут быть как видимыми (то есть явно включенными в строку), так и невидимыми (например, введенными в редакторе). В следующем примере текстовая строка преобразуется в формат HTML посредством замены символов \n разрывами строк: // Текстовая строка, отображаемая в редакторе. $text_recipe = " Party Sauce recipe: 1 can stewed tomatoes 3 tablespoons fresh lemon juice Stir together, server cold."; // Преобразовать символы новой строки в <br/> $htinl_recipe = nl2br($text_recipe) При последующем выводе $html_recipe браузеру будет передан следующий текст в формате HTML: Party Sauce recipe:<br/> 1 can stewed tomatoes<br/> 3 tablespoons fresh lemon juice<br/> Stir together, server cold.<br/> htmlentities( ) Функция htmlentities( ) преобразует символы в эквивалентные конструкции HTML. Синтаксис функции htmlentities: string htmlentities (string строка) В следующем примере производится необходимая замена символов строки для вывода в браузере: $user_input = "The cookbook, entitled Cafe Francaise' costs < $42.25."; $converted_input = htmlentities($user_input); // $converted_input = "The cookbook, entitled 'Cafè // Fracçiaise' costs < 42.25.";
Функция htmlentities( ) в настоящее время работает только для символов кодировки ISO-8559-1 (ISO-Latin-1). Кроме того, она не преобразует пробелы в htmlspecialchars( ) Функция htmlspecialchars( ) заменяет некоторые символы, имеющие особый смысл в контексте HTML, эквивалентными конструкциями HTML. Синтаксис функции htmlspecialchars( ): string htmlspecialchars (string строка) Функция html special chars( ) в настоящее время преобразует следующие символы:
В частности, эта функция позволяет предотвратить ввод пользователями разметки HTML в интерактивных web-приложениях (например, в электронных форумах). Ошибки, допущенные в разметке HTML, могут привести к тому, что вся страница будет формироваться неправильно. Впрочем, у этой задачи существует и более эффективное решение - полностью удалить теги из строки функцией strip_tags( ). Следующий пример демонстрирует удаление потенциально опасных символов функцией htmlspeclalchars( ): $user_input = "I just can't get of PHP & those fabulous cooking recipes!"; $conv_input = htmlspecialchars($user_input); // $conv_input = "I just can't <<enough>> of PHP & those fabulous cooking recipes!"
Если функция htmlspecialchars( ) используется в сочетании с nl2br( ), то последнюю следует вызывать после htmlspecialchars( ). В противном случае конструкции get_html_translation_table( ) Функция get_html_translation_table( ) обеспечивает удобные средства преобразования текста в эквиваленты HTML Синтаксис функции get_htrril_translation_table( ): string get_html_translation_table (int таблица) Функция get_html_translation_table( ) возвращает одну из двух таблиц преобразования (определяется параметром таблица), используемых в работе стандартных функций htmlspecialchars( ) и htmlentities( ). Возвращаемое значение может использоваться в сочетании с другой стандартной функцией, strtr( ) (см. далее), для преобразования текста в код HTML. Параметр таблица принимает одно из двух значений:
В следующем примере функция get_html_translation_table( ) используется при преобразовании текста в код HTML: $string = "La pasta e il piatto piu amato in Italia"; $translate = get_html_translation_table(HTML_ENTITIES); print strtr($string, $translate); // Специальные символы преобразуются в конструкции HTML // и правильно отображаются в браузере. Кстати, функция array_flip( ) позволяет провести преобразование текста в HTML в обратном направлении и восстановить исходный текст. Предположим, что вместо вывода результата strtr( ) в предыдущем примере мы присвоили его переменной $translated string. В следующем примере исходный текст восстанавливается функцией array_flip( ): $translate = array_flip($translate); $translated_string - "La pasta é il piatto piú amato in Italia"; $original_string = strtr($translated_string, $translate); // $original_string = "La pasta e il piatto piu amato in Italia"; strtr( ) Функция strtr( ) транслирует строку, то есть заменяет в ней все символы, входящие в строку источник, соответствующими символами строки приемник. Синтаксис функции strtr( ): string strtr (string строка, string источник, string приемник)
Если строки Существует альтернативный синтаксис вызова strtr( ) с двумя параметрами; в этом случае второй параметр содержит ассоциативный массив, ключи которого соответствуют заменяемым подстрокам, а значения - заменяющим подстрокам. В следующем примере теги HTML заменяются XML-подобными конструкциями: $source = array("<title>" => "<h1>", "</title> => "</h1>"); $string = "<h1>Today In PHP-Powered News"</h1>"; print strtr($string, $source); // Выводится строка "<title>Today in PHP-Powered News</title>" Преобразование HTML в простой текстИногда возникает необходимость преобразовать файл в формате HTML в простой текст. Функции, описанные ниже, помогут вам в решении этой задачи. strip_tags( ) Функция strip_tags( ) удаляет из строки все теги HTML и РНР, оставляя в ней только текст. Синтаксис функции strip_tags( ): string strip_tags (string строка [, string разрешенные_тerи])
Необязательный параметр Ниже приведен пример удаления из строки всех тегов HTML функцией strip_tags( ): $user_input = "I just <b>love</b> РНР and <i>gourment</i> recipes!"; $stripped_input = strip_tags($user_input); // $stripped_input = "I just love PHP and gourmet recipes!"; В следующем примере удаляются не все, а лишь некоторые теги: $input = "I <b>love</b> to <a href = \"http://www.eating.com\">eat!</a>!"; $strip_input = strip_tags ($user_input, "<a>"); // $strip_input = "I love to <a href = \"http://www.eating.com\">eat!</a>!"; get_meta_tags( ) Хотя функция get_meta_tags( ) и не имеет прямого отношения к преобразованию текста, зто весьма полезная функция, о которой следует упомянуть. Синтаксис функции get_meta_tags( ): array get_meta_tags (string имя_файла/URL [, int включение_пути]) Функция get_meta_tags( ) предназначена для поиска в файле HTML тегов МЕТА. Теги МЕТА содержат информацию о странице, используемую главным образом поисковыми системами. Эти теги находятся внутри пары тегов <head>...</head>. Применение тегов МЕТА продемонстрировано в следующем фрагменте (назовем его example.html, поскольку он будет использоваться в листинге): <html> <head> <title>PHP Recipes</title> <meta name="keywords" content="gourmet. PHP, food. code, recipes, chef, programming, web"> <meta name="description" content="PHP Recipes provides savvy readers with the latest in PHP programming and gourmet cuisine!"> <meta name="author" content="WJ Gilmore"> </head> Функция get_meta_tags( ) ищет в заголовке документа теги, начинающиеся словом МЕТА, и сохраняет имена тегов и их содержимое в ассоциативном массиве. В листинге продемонстрировано применение этой функции к файлу example.html. Извлечение тегов МЕТА из файла HTML функцией get_meta_tags( ) $meta_tags = get_meta_tags("example.html"): // Переменная $meta_tags содержит массив со следующей информацией: // $meta_tags["keywords"] = "gourmet. PHP. food. code, recipes, chef, programming. Web": // $meta_tags["description"] = "PHP Recipes provides savvy readers with the latest in PHP programming and gourmet cuisine"; // $meta_tags["author"] = "WJ Gilmore"; Интересная подробность: данные тегов МЕТА можно извлекать не только из файлов, находящихся на сервере, но и из других URL. Преобразование строки к верхнему и нижнему региструВ РНР существует четыре функции, предназначенных для изменения регистра строки:
strtolower( ) Функция strtolower( ) преобразует все алфавитные символы строки к нижнему регистру. Синтаксис функции strtolower( ):string strtolower(string строка) Неалфавитные символы функцией не изменяются. Преобразование строки к нижнему регистру функцией strtolower( ) продемонстрировано в следующем примере: $sentence = "COOKING and PROGRAMMING PHP are my TWO favorite pastimes!"; $sentence = strtolower($sentence); // После вызова функции $sentence содержит строку // "cooking and programming php are my two favorite pastimes!" strtoupper( ) Строки можно преобразовывать не только к нижнему, но и к верхнему регистру. Преобразование выполняется функцией strtoupper( ), имеющей следующий синтаксис: string strtoupper (string строка) Неалфавитные символы функцией не изменяются. Преобразование строки к верхнему регистру функцией strtoupper( ) продемонстрировано в следующем примере: $sentence = "cooking and programming PHP are my two favorite pastimes!"; $sentence = strtoupper($sentence); // После вызова функции $sentence содержит строку // "COOKING AND PROGRAMMING PHP ARE MY TWO FAVORITE PASTIMES!" ucfirst( ) Функция ucfirst( ) преобразует к верхнему регистру первый символ строки - при условии, что он является алфавитным символом. Синтаксис функции ucfirst( ): string ucfirst (string строка) Неалфавитные символы функцией не изменяются. Преобразование первого символа строки функцией ucfirst( ) продемонстрировано в следующем примере: &sentence = "cooking and programming PHP are my two favorite pastimes!"; $sentence = ucfirst($sentence); // После вызова функции $sentence содержит строку // "Cooking and programming PHP are mу two favorite pastimes!" ucwords( ) Функция ucwords( ) преобразует к верхнему регистру первую букву каждого слова в строке. Синтаксис функции ucwords( ): string ucwords (string строка") Неалфавитные символы функцией не изменяются. <Слово> определяется как последовательность символов, отделенная от других элементов строки пробелами. В следующем примере продемонстрировано преобразование первых символов слов функцией ucwords( ): $sentence = "cooking and programming PHP are my two favorite pastimes!"; $sentence = ucwords($sentence); // После вызова функции $sentence содержит строку // "Cooking And Programming PHP Are My Two Favorite Pastimes!" Проект: идентификация браузераКаждый программист, пытающийся создать удобный web-сайт, должен учитывать различия в форматировании страниц при просмотре сайта в разных браузерах и операционных системах. Хотя консорциум W3 (http://www.w3.org) продолжает публиковать стандарты, которых должны придерживаться программисты при создании web-приложений, разработчики браузеров любят дополнять эти стандарты своими маленькими <усовершенствованиями>, что в конечном счете вызывает хаос и путаницу. Разработчики часто решают эту проблему, создавая разные страницы для каждого типа браузера и операционной системы - при этом объем работы значительно увеличивается, но зато итоговый сайт идеально подходит для любого пользователя. Результат - хорошая репутация сайта и уверенность в том, что пользователь посетит его снова. Чтобы пользователь мог просматривать страницу в формате, соответствующем специфике его браузера и операционной системы, из входящего запроса на получение страницы извлекается информация о браузере и платформе. После получения необходимых данных пользователь перенаправляется на нужную страницу. Приведенный ниже проект (sniffer.php) показывает, как использовать функции РНР для работы с регулярными выражениям с целью получения информации по запросам. Программа определяет тип и версию браузера и операционной системы, после чего выводит полученную информацию в окне браузера. Но прежде чем переходить к непосредственному анализу программы, я хочу представить один из главных ее компонентов - стандартную переменную РНР $HTTP_USER_AGENT. В этой переменной в строковом формате хранятся различные сведения о браузере и операционной системе пользователя - именно то, что нас интересует. Эту информацию можно легко вывести на экран всего одной командой: <?php echo $HTTP USER_AGENT; ?>
При работе в Internet Explorer 5.0 на компьютере с Windows 98 результат будет выглядеть так:
Для Netscape Navigator 4.75 выводятся следующие данные: Sniffer.php извлекает необходимые данные из $HTTP_USER_AGENT при помощи функций обработки строк и регулярных выражений. Алгоритм программы на псевдокоде:
Идентификация типа браузера и операционной системы клиента
<?php
|
||||||||||