Файл: ycheb/php_teach/08.php
Строк: 643
<?php
include '../../config.php';
$title='Учебник PHP';
aut();
head();
?>
<html><head>
<title>Учебник PHP, Глава 8</title>
<meta http-equiv="Content-type" content="text/html; charset=Windows-1251">
</head>
<DIV class=infotxt>
<LI><A href="#a">Глава 8. Строки и
регулярные выражения</A>
<UL>
<LI><A href="#b">Регулярные выражения</A>
<UL>
<LI><A href="#c">синтаксис регулярных
выражений(POSIX)</A> </LI></UL>
<LI><A href="#d">Функции PHP для работы с
регулярными выражениями(POSIX-совместимые)</A>
<LI><A href="#e">Синтаксис регулярных
выражений в стиле Perl</A>
<UL>
<LI><A href="#f">Метасимволы</A>
<LI><A href="#g">Модификаторы</A>
</LI></UL>
<LI><A href="#h">Функции PHP для работы с
регулярными выражениями(Perl-совместимые)</A>
<LI><A href="#i">Другие строковые
функции</A>
<UL>
<LI><A href="#j">Дополнение и сжатие
строк</A>
<LI><A href="#k">Определение длины
строки</A>
<LI><A href="#l">Сравнение двух
строк</A>
<LI><A href="#m">Обработка строковых
данных без применения регулярных выражений</A>
<LI><A href="#n">Преобразование строк и
файлов к формату HTML и наоборот</A>
<LI><A href="#o">Преобразование HTML в
простой текст</A>
<LI><A href="#p">Преобразование строки к
верхнему и нижнему регистру</A> </LI></UL>
<LI><A href="#q">Проект: идентификация
браузера</A>
<LI><A href="#r">Итоги</A> </LI></UL>
<UL></UL><A name=a></A>
<P> </P>
<P>ГЛАВА 8</P>
<P>Строки и регулярные выражения</P>
<P>Возможности эффективной организации, поиска и распространения
информации давно представляли интерес для специалистов в области
компьютерных технологий. Поскольку информация в основном представляет
собой текст, состоящий из алфавитно-цифровых символов, разработка средств
поиска и обработки информации по шаблонам, описывающим текст, стала
предметом серьезных теоретических исследований.</P>
<P>Поиск по шаблону позволяет не только находить определенные фрагменты
текста, но и заменять их другими фрагментами. Одним из стандартных
примеров поиска по шаблону являются команды поиска/замены в текстовых
редакторах — например, в MS Word, Emacs и в моем любимом редакторе vi.
Всем пользователям UNIX хорошо известны такие программы, как sed, awk и
grep; богатство возможностей этих программ в значительной степени
обусловлено средствами поиска по шаблону. Механизмы поиска по шаблону
решают четыре основные задачи:</P>
<UL>
<LI>поиск строк, в точности совпадающих с заданным шаблоном;
<LI>поиск фрагментов строк, совпадающих с заданным шаблоном;
<LI>замену строк и подстрок по шаблону;
<LI>поиск строк, с которыми заданный шаблон не совпадает. </LI></UL>
<P>Появление Web породило необходимость в более быстрых и эффективных
средствах поиска данных, которые бы позволяли пользователям со всего мира
находить нужную информацию среди миллиардов web-страниц. Поисковые
системы, онлайновые финансовые службы и сайты электронной коммерции — все
это стало бы абсолютно бесполезным без средств анализа гигантских объемов
данных в этих секторах. Действительно, средства обработки строковой
информации являются жизненно важной составляющей практически любого
сектора, так или иначе связанного с современными информационными
технологиями. В этой главе основное внимание посвящено средствам обработки
строк в РНР. Мы рассмотрим некоторые стандартные строковые функции (в
языке их больше 60!), а из приведенных определений и примеров вы получите
сведения, необходимые для создания web-приложений. Но прежде чем
переходить к специфике РНР, я хочу познакомить вас с базовым механизмом,
благодаря которому становится возможным поиск по шаблону. Речь идет о
регулярных выражениях.</P>
<P><A href="http.html://doks.gorodok.net/0" name=b></A>Регулярные выражения</P>
<P>Регулярные выражения лежат в основе всех современных технологий поиска
по шаблону. Регулярное выражение представляет собой последовательность
простых и служебных символов, описывающих искомый текст. Иногда регулярные
выражения бывают простыми и понятными (например, слово dog), но часто в
них присутствуют служебные символы, обладающие особым смыслом в синтаксисе
регулярных выражений, — например, <(?)>.*</.?>.</P>
<P>В РНР существуют два семейства функций, каждое из которых относится к
определенному типу регулярных выражений: в стиле POSIX или в стиле Perl.
Каждый тип регулярных выражений обладает собственным синтаксисом и
рассматривается в соответствующей части главы. На эту тему были написаны
многочисленные учебники, которые можно найти как в Web, так и в книжных
магазинах. Поэтому я приведу лишь основные сведения о каждом типе, а
дальнейшую информацию при желании вы сможете найти самостоятельно. Если вы
еще не знакомы с принципами работы регулярных выражений, обязательно
прочитайте краткий вводный курс, занимающий всю оставшуюся часть этого
раздела. А если вы хорошо разбираетесь в этой области, смело переходите к
следующему разделу.</P>
<P><A name=c></A>Синтаксис регулярных выражений (POSIX)</P>
<P>Структура регулярных выражений POSIX чем-то напоминает структуру
типичных математических выражений — различные элементы (операторы)
объединяются друг с другом и образуют более сложные выражения. Однако
именно смысл объединения элементов делает регулярные выражения таким
мощным и выразительным средством. Возможности не ограничиваются поиском
литерального текста (например, конкретного слова или числа); вы можете
провести поиск строк с разной семантикой, но похожим синтаксисом —
например, всех тегов HTML в файле.</P>
<P>Простейшее регулярное выражение совпадает с одним литеральным символом
— например, выражение g совпадает в таких строках, как g, haggle и bag.
Выражение, полученное при объединении нескольких литеральных символов,
совпадает по тем же правилам — например, последовательность gan совпадает
в любой строке, содержащей эти символы (например, gang, organize или
Reagan).</P>
<P>Оператор | (вертикальная черта) проверяет совпадение одной из
нескольких альтернатив. Например, регулярное выражение php | zend
проверяет строку на наличие php или zend.</P>
<P>Квадратные скобки</P>
<P>Квадратные скобки ([ ]) имеют особый смысл в контексте регулярных
выражений — они означают «любой символ из перечисленных в скобках». В
отличие от регулярного выражения php, которое совпадает во всех строках,
содержащих литеральный текст php, выражение [php] совпадает в любой
строке, содержащей символы р или h. Квадратные скобки играют важную роль
при работе с регулярными выражениями, поскольку в процессе поиска часто
возникает задача поиска символов из заданного интервала. Ниже перечислены
некоторые часто используемые интервалы:</P>
<UL>
<LI>[0-9] — совпадает с любой десятичной цифрой от 0 до 9;
<LI>[a-z] — совпадает с любым символом нижнего регистра от а до z;
<LI>[A-Z] — совпадает с любым символом верхнего регистра от А до Z;
<LI>[a -Z] — совпадает с любым символом нижнего или верхнего регистра от
а до Z. </LI></UL>
<P>Конечно, перечисленные выше интервалы всего лишь демонстрируют общий
принцип. Например, вы можете воспользоваться интервалом [0-3] для
обозначения любой десятичной цифры от 0 до 3 или интервалом [b-v] для
обозначения любого символа нижнего регистра от b до v. Короче говоря,
интервалы определяются совершенно произвольно.</P>
<P>Квантификаторы</P>
<P>Существует особый класс служебных символов, обозначающих количество
повторений отдельного символа или конструкции, заключенной в квадратные
скобки. Эти служебные символы (+, * и {...}) называются квантификаторами.
Принцип их действия проще всего пояснить на примерах:</P>
<UL>
<LI>р+ означает один или несколько символов р, стоящих подряд;
<LI>р* означает ноль и более символов р, стоящих подряд;
<LI>р? означает ноль или один символ р;
<LI>р{2} означает два символа р, стоящих подряд;
<LI>р{2,3} означает от двух до трех символов р, стоящих подряд;
<LI>р{2,} означает два и более символов р, стоящих подряд. </LI></UL>
<P>Прочие служебные символы</P>
<P>Служебные символы $ и ^ совпадают не с символами, а с определенными
позициями в строке. Например, выражение р$ означает строку, которая
завершается символом р, а выражение ^р — строку, начинающуюся с символа
р.</P>
<UL>
<LI>Конструкция [^a-zA-Z] совпадает с любым символом, не входящим в
указаные интервалы (a-z и A-Z).
<LI>Служебный символ . (точка) означает «любой символ». Например,
выражение р.р совпадает с символом р, за которым следует произвольный
символ, после чего опять следует символ р. </LI></UL>
<P>Объединение служебных символов приводит к появлению более сложных
выражений. Рассмотрим несколько примеров:</P>
<UL>
<LI>^.{2}$ — любая строка, содержащая ровно два символа;
<LI><b>(.*)</b> — произвольная последовательность символов,
заключенная между <Ь> и </Ь> (вероятно, тегами HTML для
вывода жирного текста);
<LI>p(hp)* — символ р, за которым следует ноль и более экземпляров
последовательности hp (например, phphphp). </LI></UL>
<P>Иногда требуется найти служебные символы в строках вместо того, чтобы
использовать их в описанном специальном контексте. Для этого служебные
символы экранируются обратной косой чертой (). Например, для поиска
денежной суммы в долларах можно воспользоваться выражением $[0-9]+, то
есть «знак доллара, за которым следует одна или несколько десятичных
цифр». Обратите внимание на обратную косую черту перед $. Возможными
совпадениями для этого регулярного выражения являются $42, $560 и $3.</P>
<P>Стандартные интервальные выражения (символьные классы)</P>
<P>Для удобства программирования в стандарте POSIX были определены
некоторые стандартные интервальные выражения, также называемые символьными
классами (character classes). Символьный класс определяет один символ из
заданного интервала — например, букву алфавита или цифру:</P>
<UL>
<LI>[[:alpha:]] — алфавитный символ (aA-zZ);
<LI>[[:digit:]]-цифра (0-9);
<LI>[[:alnum:]] — алфавитный символ (aA-zZ) или цифра (0-9);
<LI>[[:space:]] — пропуски (символы новой строки, табуляции и т. д.).
</LI></UL>
<P><A name=d></A>Функции РНР для работы с регулярными выражениями
(POSIX-совместимые)</P>
<P>В настоящее время РНР поддерживает семь функций поиска с использованием
регулярных выражений в стиле POSIX:</P>
<UL>
<LI>еrеg( );
<LI>еrеg_rерlасе( );
<LI>eregi( );
<LI>eregi_replace( );
<LI>split( );
<LI>spliti( );
<LI>sql_regcase( ). </LI></UL>
<P>Описания этих функций приведены в следующих разделах.</P>
<P>ereg( )</P>
<P>Функция еrеg( ) ищет в заданной строке совпадение для шаблона. Если
совпадение найдено, возвращается TRUE, в противном случае возвращается
FALSE. Синтаксис функции ereg( ):</P>
<P>int ereg (string шаблон, string строка [, array совпадения])</P>
<P>Поиск производится с учетом регистра алфавитных символов. Пример
использования ereg( ) для поиска в строках доменов .соm:</P>
<P>$is_com - ereg("(.)(com$)", $email):</P>
<P>// Функция возвращает TRUE, если $email завершается символами
".com"</P>
<P>// В частности, поиск будет успешным для строк</P>
<P>// "www.wjgilmore.com" и "someemail@apress.com"</P>
<P>Обратите внимание: из-за присутствия служебного символа $ регулярное
выражение совпадает только в том случае, если строка завершается символами
.com. Например, оно совпадет в строке "www.apress.com", но не совпадет в
строке "www.apress.com/catalog".</P>
<P>Необязательный параметр совпадения содержит массив совпадений для всех
подвыражений, заключенных в регулярном выражении в круглые скобки. В
листинге 8.1 показано, как при помощи этого массива разделить URL на
несколько сегментов.</P>
<P>Листинг 8.1. Вывод элементов массива $regs</P>
<P>$url = "http://www.apress.com";</P>
<P>// Разделить $url на три компонента: "http://www". "apress" и "com"</P>
<P>$www_url = ereg("^(http://www).([[:alnum:]+.([[:alnum:]]+)". $url,
$regs);</P>
<P>if ($www_url) : // Если переменная $www_url содержит URL</P>
<P>echo $regs[0]; // Вся строка "http://www.apress.com"</P>
<P>print "<br>";</P>
<P>echo $regs[l]; // "http://www"</P>
<P>print "<br>";</P>
<P>echo $regs[2]; // "apress"</P>
<P>print "<br>";</P>
<P>echo $regs[3]; // "com" endif;</P>
<P>При выполнении сценария в листинге 8.1 будет получен следующий
результат:</P>
<P>http://www.apress.com http://www apress com</P>
<P>ereg_replace( )</P>
<P>Функция ereg_replace( ) ищет в заданной строке совпадение для шаблона и
заменяет его новым фрагментом. Синтаксис функции ereg_replace( ):</P>
<P>string ereg_replace (string шаблон, string замена, string строке)</P>
<P>Функция ereg_replace( ) работает по тому же принципу, что и ereg( ), но
ее возможности расширены от простого поиска до поиска с заменой. После
выполнения замены функция возвращает модифицированную строку. Если
совпадения</P>
<P>отсутствуют, строка остается в прежнем состоянии. Функция ereg_replace(
), как и еrеg( ), учитывает регистр символов. Ниже приведен простой
пример, демонстрирующий применение этой функции:</P>
<P>$copy_date = "Copyright 1999":</P>
<P>$copy_date = ereg_replace("([0-9]+)". "2000", $copy_date);</P>
<P>print $copy_date: // Выводится строка "Copyright 2000"</P>
<P>У средств поиска с заменой в языке РНР имеется одна интересная
возможность — возможность использования обратных ссылок на части основного
выражения, заключенные в круглые скобки. Обратные ссылки похожи на
элементы необязательного параметра-массива совпадения функции еrеg( ) за
одним исключением: обратные ссылки записываются в виде