Регулярные выражения
До последнего времени для меня величайщей загадкой и китайской грамотой
представлялись загадочные "регулярные выражения" (regular experssions). Что же
это такое?
Регулярные выражения - самый мощный инструмент работы со строками, который
смогли выдумать современные программисты. С их помощью можно проводить анализ
строк, на содержание последовательностей символов, производить замену на основе
этой выборки, разбивать строки на массивы и многое другое.
Проще всего разобраться с их устройством на примерах. Для этого можно
использовать специальные функции PHP для работы с регулярными выражениями
(RE): ereg(); ereg_replace(); eregi(); ereg_replacei(); split();
Функции с суффиксом i представляют из себя аналоги функций без этого
суффикса, не чувствтительные к регистру операндов. Рассмотрим, для начала,
функцию split().
Выглядит она так: array split(string pattern, string string, int [limit]);.
Основным ее параметром является pattern (шаблон). В нем содержится RE, для
поиска в строке string. Эта функция строит массив на основе анализа строки, где
разделителем является строка, заданная шаблоном.
Принцип работы этой функции на понятном языке выглядит не так уж и страшно:
Разбить строку на компоненты (подстроки), соответствующий правилам, описаным в
параметре pattern. Правило может выглядеть, например, так: Слова разделены
запятой и любым количеством пробелов, причем пробелов может не быть. Это вполне
"жизненное" правило. На его основе можно построить массив ключевых слов,
содержащихся в строке и разделенных запятыми, а после запятой может идти любое
количество пробелов (но не обязательно). Теперь рассмотрим как записать это
правило в нотации RE.
, *. Каждый символ в шаблоне важен. Обратите внимание на пробел между запятой
и звездочкой - это необходимый элемент шаблона. Первый символ означает
обязательную запятую после слова, а комбинация " *" (помните, что пробел -
элемент шаблона) - любое количество пробелов или их отсутствие. Звездочка
является модификатором и говорит, что идущий перед ней символ может встречаться
0 или больше раз.
Рассмотрим, как все это реализовать на PHP с помощью RE: $str = "test, one, to, sree";
$regs = split(", *",$str);
for ($i = 0; $i <= count($regs)-1; $i++) {
echo $i," : ",$regs[$i];
}
И результат работы данного кода: 0 : test 1 : one 2 : to 3 : sree
Причем, строка $str может выглядеть так: "test, one, to, sree", или так:
"test,one,to,sree", или так: "test,one, to, sree". Результат будет
одинаковым.
Перейдем к более сложному примеру из жизни. Попытаемся определить версию
браузера из строки $HTTP_USER-AGENT, для Internet Explorer. Типичная строка
выглядит так: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Сначала попытаемся определить правило выборки номера версии обычным языком.
Перед номером версии обязательно идет комбинация символов "MSIE" и пробел,
заканчивается номер версии точкой с запятой. Просто? Теперь запишем это в
терминах RE. MSIE ([^;]+). Как видите, здесь используются скобки различной
конфигурации. Что они означают? Круглые скобки определяют тот элемент, который
мы ищем в строке (в нашем случае - шаблон номера версии версии). Квадратные -
определяют набор символов, каждый из которых может составлять часть номера
версии. ^ - представляет собой отрицание. Т.е. конструкция [^;], в переводе на
русский означает "любой символ, кроме точки с запятой". + после квадратных
скобок говорит, что таких символов (отличных от ;) должно быть минимум 1 (или
больше). Круглые скобки обозначают границы искомой подстроки. Соответствующая
шаблону в круглых скобках подстрока сохраняется в специальной переменной. Таким
образом RE MSIE ([^;]+) переводится на русский язык, как "все символы, отличные
от точки с запятой, следующие за набором символов MSIE и пробелом".
Но нам необходимо получить номер версии. Для этого существует функция ereg()
(или ее регистронезависимый аналог eregi()). Выглядит она так: int ereg(string
pattern, string string, array [regs]);. В параметре pattern передается шаблон, в
string - строка для разбора, а в параметре regs передается массив найденых
подстрок, соответствующих шаблону в круглых скобках. Первый (с индексом 0)
элемент массива представляет собой подстроку, соответсвующую всему шаблону
pattern. Если подстрока, соответствующая шаблону pattern не найдена, то
возвращается значение false иначе, количество найденных подстрок.
В данном случае вызов этой функции будет выглядеть так: ereg("MSIE ([^;]+)",$HTTP_USER_AGENT,$regs); echo "$HTTP_USER_AGENT : $HTTP_USER_AGENT
"; echo "VERSION : $regs[1]";
Вот результат работы этого кода: $HTTP_USER_AGENT : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) VERSION : 6.0
Автор: Андрей Головин
Источник: www.woweb.ru
|