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;
?>