Портал для веб-мастера
Вход пользователей
Поиск статей
WoWeb.ru » Статьи » Программирование для Web » PHP

Регулярные выражения.

До последнего времени для меня величайщей загадкой и китайской грамотой представлялись загадочные "регулярные выражения" (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 
Автор: Андрей Головин · Добавлена: 2002-07-04
Просмотров: 2867 · Рейтинг: 3.0

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Категории раздела
Flash
Apache
WWW
PhotoShop
Веб-дизайн
Раскрутка и реклама
Базы данных
3D графика
Хостинг
Истории веб-мастеров
Web-технологии
Сетевая безопасность
Программирование для Web
Операционные системы

Новые статьи
Лучшие статьи
Популярные статьи
Комментируемые статьи
Разделы сайта
Скрипты
Статьи
Шрифты
Флэш исходники
HTML шаблоны
Партнерки
Клипарты
Смайлы
Фоны
Гифы
Иконки
Опрос сайта
Есть ли у вас свой сайт?
Всего ответов: 141129
Наша кнопка
WoWeb.ru - портал для веб-мастера