Главная > Программирование > РНР: настольная книга программиста
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

11.3. Регулярные выражения PHP/FI2 и выражения присваивания

Регулярные выражения используются для сложного манипулирования строками в PHP/FI. Поддержка интерфейса между скриптом и регулярными выражениями осуществляется через следующие функции: reg_match(), reg_replace() и reg_search(). Первый аргумент всех трех функций — это строка, задающая регулярное выражение и состоящая из регулярных и специальных символов. Регулярные символы имеют то же значение, что и в других командах Unix, а специальные символы имеют специальное значение (табл. 11.1).

Таблица 11.1. Регулярные выражения PHP/FI2 и выражения присваивания


. — Специальный символ, который соответствует любому символу, за исключением символа новой строки. Используя его, можно задавать регулярные выражения, подобные а.b, которое соответствует любой трехсимвольной строке, начинающейся с а и заканчивающейся b

* — Это не конструкция, а суффикс, который означает, что предшествующее регулярное выражение может быть повторено определенное количество раз. В строке fо* символ * применяется к символу о, так о* задает f с последующим любым количеством символов о. В случае нулевого количества символов о строка будет также соответствовать f. Символ * всегда применяет к наименьшему возможному предшествующему выражению. Таким образом, fо* задает повторение о, а не повторение fo. Процесс сравнения обрабатывает конструкцию *, пытаясь выполнить настолько много повторений, насколько много их может быть найдено. Затем он продолжает обработку остальной части шаблона. Если впоследствии появится несоответствие с шаблоном, происходит возврат путем отбрасывания некоторых повторений *, если это делает возможным совпадение остальной части шаблона. Например, шаблон с [ad] *агдля строки caddaar, [ad]* сначала совпадает с addaa, но это не позволяет совпасть следующему символу а в шаблоне. Так, последнее совпадение [ad] отменяется, и следующий символ а пробуется вновь. Теперь шаблон соответствует

+ — Подобен *, за исключением того, что требуется по крайней мере одно соответствие для предшествующего образца. Таким образом, с [ad] +r не совпадает с cr, но совпадет с чем-либо еще, что может быть задано шаблоном

? — Подобен *, за исключением того, что позволяет задать нуль или более соответствий для заданного шаблона. Таким образом, шаблон с [ad]?r будет задавать строки cr или car, или cdr, и ничего больше

[...] — [начинает «множество символов», которое завершается символом ]. В самом простом случае символы между этими двумя скобками формируют множество. Таким задает символы и любую последовательность символов аи а(включая и пустую строку), из чего следует, что шаблон с [ad]*r задает car, и т. д. Диапазон символов также может быть включен в множество символов, с помощью символа -, помещенного между двумя другими.

Таким образом, шаблон [a-z] задает любой символ нижнего регистра. Диапазоны могут свободно перемежаться одиночными символами, как в шаблоне [a-z$%.], который задает любой символ нижнего регистра или символы $, %либоточку. Обратите внимание, что символы, обычно являющиеся специальными, внутри множества символов не являются таковыми. Внутри множества символов существует полностью отличный набор специальных символов: ], - и ^. Чтобы включить ] во множество символов, нужно сделать его первым символом. Например, шаблон [] а] задает символ ] или а. Чтобы включить символ -, нужно использовать его в таком контексте, где он не может указывать диапазон, т. е. или первым символом, или сразу после диапазона

[^...] — начинает «исключающее множество символов», который задает любой символ, за исключением заданных. Таким образом, шаблон [Aa-z0-9A-z] задает любой символ, за исключением букв и цифр. ^ не является специальным символом в множестве, если только это не первый символ. Символ, следующий после ^, обрабатывается так, как будто он является первым (это может быть - или ]). Является специальным символом, который задает начало строки

$ — Подобен ^, но только задает конец строки

\ — Имеет два значения: выводит на экран вышеперечисленные специальные символы (включая \) и задаетдополнительные специальные конструкции. Так как \ экранирует специальные символы, \$ является регулярным выражением, задающим только символ $, а \ [ является регулярным выражением, задающим только [, и т. д. В основном \ с последующим любым символом соответствует только этому символу. Однако есть некоторые исключения: символы, в которых \ предшествует специальная конструкция

| — Задает альтернативу. Два регулярных выражения А и в с | между ними формируют выражение, которое задает что-либо, чему соответствует или А, или В. Так, выражение foo | bar выводит или foo, или bar, но никакую другую строку. | применяется к максимально большим окружающим выражениям. Только \(, .. \) вокруг выражений могут ограничивать количество символов |. Существует полная возможность перебора с возвратами, когда задано множество |

\b — Задает границы слова

\B — Задает отсутствие границ слова, т. е. указывает, что в данном месте не может быть границы слова

\w — Задает любой символ, являющийся составной частью слова

\w — Задает любой символ, который не является составной частью слова

\(...\) — Является конструкцией группировки, которая служит нескольким целям, например заключать в себя множество альтернатив | для других операций. Так, шаблон (foo|bar)x соответствует или foox или barх. Также служит для объединения нескольких элементов для операции над ними как элементом, например шаблон bа\ (na\) * задает bananana с любым (нуль или более) количеством na


Обратимся к примеру, с которым мы уже разобрались, $а = 5. Легко заметить, что тут задействованы два значения: значение целой константы 5 и значение $а, которое также становится равным пяти. На самом деле здесь присутствует еще одно значение — присваивания. Само присваивание становится равным присваиваемому значению, в данном случае — 5. На практике это означает, что $а = 5, не обращая внимания на то, что оно равно выражению со значением пять, т. е. запись типа $b = ($а = 5) похожа на запись $а = 5; $b = 5; (точка с запятой отмечает конец выражения). Присваивания рассматриваются справа налево, поэтому вы также можете написать $b = $а = 5.

Еще один пример направления выражения — это предварительное и последующее увеличение и уменьшение. Пользователи PHP/FI2 и многих других языков могут быть знакомы с записями variable++ и variable--. PHP расширяет возможность увеличения/уменьшения, делая их выражениями, как и в С. В РНР, подобно С, есть два типа инкремента и декремента — префиксный и постфиксный. При использовании префиксного инкремента/декремента значение переменной сначала участвует в выражении, а после этого изменяется значение самой переменной.

Пример 11.4. Инкремент/декремент переменной

<?

$а = 5;

$b = 2;

$а++;

$b--;

echo $а;

echo $b;

?>

При выполнении данной программы получим следующие результаты: переменная $а будет иметь значение 6, а $b — 1. Более подробно об этих операциях рассказано в главе 12.

Пример 11.5. Префиксный и постфиксный инкременты

<?

$а = 1;

$b = $а++;// b=1, а=2

echo $b;

$b=++$a; // b=3, a=3;

echo $b;

?>

<< Предыдущий параграф Следующий параграф >>
Оглавление