Опубликован: 01.03.2005 | Доступ: свободный | Студентов: 33881 / 4520 | Оценка: 4.31 / 4.06 | Длительность: 16:41:00
ISBN: 978-5-9556-0026-0
Лекция 13:

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

< Лекция 12 || Лекция 13: 12345 || Лекция 14 >
Аннотация: В лекции рассматривается понятие регулярного выражения, реализация механизма регулярных выражений в языке PHP, их синтаксис и семантика. Пример – задача контекстного поиска.
Ключевые слова: регулярное выражение, regular expression, адрес, шаблон, специальный символ, почтовый ящик, COM, org, множества, word, html-форма, поиск, тип данных, Unix, PHP, explode, разбиение, strstr, str_replace, представление, POSIX-совместимое регулярное выражение, Perl-совместимое регулярное выражение, синтаксис, Windows, preg_match, preg_match_all, шаблон регулярного выражения, массив, подшаблон, параметр, функция, захват, подвыражение, булева функция, POSIX, ereg, определение, модификатор регулярного выражения, метасимвол, значение, использование обратного слэша в регулярных выражениях, кодирование, escape, пустой символ, пробел, символьные типы, диапазон, подстрока, слово, описание подмножеств, класс, квантификатор, перечисление, метасимволы, диапазон символов, альтернативные варианты в регулярных выражениях, использование слэша в регулярных выражениях, обратная ссылка, общий квантификатор, сокращенный квантификатор, "жадность" квантификатора, опция PCRE_UNGREEDY, список, модификатор PCRE, экранирование, символ новой строки, обратная ссылка в регулярном выражениии, утверждение в регулярном выражении, утверждение "смотрящее вперед", утверждение "смотрящее назад", альтернативный шаблон, условное подвыражение, aaas

Понятие регулярного выражения

Регулярное выражение (regular expression, сокращенно РВ ) – это технология, которая позволяет задать шаблон и осуществить поиск данных, соответствующих этому шаблону, в заданном тексте, представленном в виде строки.

Кроме того, с помощью регулярных выражений можно изменить и удалить данные, разбить строку по шаблону на подстроки и многое другое.

Одно из распространенных применений РВ – это проверка строки на соответствие каким-либо правилам. Например, следующее РВ предназначено для проверки того, что строка содержит корректный e-mail–адрес:

/^\w+([\.\w]+)*\w@\w((\.\w)*\w+)*\.\w{2,3}$/

Выглядит, конечно, жутко, но зато работает. И если уметь пользоваться этим механизмом виртуозно, то жить становится легче.

Вернемся к нашему определению РВ. В нем несколько раз повторяется термин "шаблон". Что это такое? В принципе, интуитивно понятно, но попробуем все же пояснить.

Давайте подумаем, что представляет собой корректный e-mail–адрес. Это набор букв, цифр и символов подчеркивания, после которых идет специальный символ "собака" @, затем еще один такой же набор, содержащий имя сервера, точку ( .) и две или три буквы, указывающие на зону домена, к которой принадлежит почтовый ящик (ru, com, org и т.д.). Приведенное выше РВ формализует данное описание на языке, понятном компьютеру. И описывает не какой-то конкретный электронный адрес, а все возможные корректные электронные адреса. Таким образом, производится формальное задание множества правильных e-mail'ов с помощью шаблона регулярного выражения. Другие примеры шаблонов – это шаблоны MS Word и html-формы.

Механизм регулярных выражений задает правила построения шаблонов и осуществляет поиск данных по этому шаблону в указанной строке.

В дальнейшем изложении термины РВ и "шаблон" часто будут использоваться как синонимы, но важно понимать, что это не совсем одно и то же. Шаблон задает какой-то тип данных, а РВ – это механизм, который производит поиск и включает в себя шаблон и опции поиска, а также задает язык написания шаблонов.

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

Регулярные выражения пришли из UNIX и Perl. Как упоминалось выше, с помощью регулярных выражений можно искать и изменять текст, разбивать строку на подстроки и т.д. В PHP существуют такие удобные и мощные средства работы со строками, как explode (разбиение строки на подстроки), strstr (нахождение подстроки), str_replace (замена всех вхождений подстроки). Возникает вопрос – зачем придумывать что-то еще?

Основное преимущество РВ заключается в том, что они позволяют организовать более гибкий поиск, т.е. найти то, о чем нет точного знания, но есть примерное представление. Например, нужно найти все семизначные номера телефонов, встречающиеся в тексте. Мы не ищем какой-то заранее известный нам номер телефона, мы знаем только, что искомый номер состоит из семи цифр. Для этого можно воспользоваться следующим РВ:

/\d{3}-\d{2}-\d{2}/m

В PHP существует два различных механизма для обработки регулярных выражений: POSIX-совместимые и Perl-совместимые (сокращенно PCRE ). Их синтаксис во многом похож, однако Perl-совместимые регулярные выражения более мощные и к тому же работают намного быстрее. Начиная с версии PHP 4.2.0, PCRE входят в набор базовых модулей и подключены по умолчанию. POSIX-совместимые РВ включены по умолчанию только в версию PHP для Windows.

Основные функции для работы с Perl-совместимыми регулярными выражениями: preg_match(pattern, string, result[, flags]) и preg_match_all(pattern, string, result, [flags]), где:

patternшаблон регулярного выражения ;

string – строка, в которой производится поиск;

result – содержит массив результатов (нулевой элемент массива содержит соответствие всему шаблону, первый – первому "захваченному" подшаблону и т.д.);

flags – необязательный параметр, определяющий то, как упорядочены результаты поиска.

Эти функции осуществляют поиск по шаблону и возвращают информацию о том, сколько раз произошло совпадение. Для preg_match() это 0 (нет совпадений) или 1, поскольку поиск прекращается, как только найдено первое совпадение. Функция preg_match_all() производит поиск до конца строки и поэтому находит все совпадения. Все точные совпадения содержатся в первом элементе массива result у каждой из этих функций (для preg_match_all() этот элемент – тоже массив).

Про "захват" элементов будет рассказано в разделе, посвященном подвыражениям.

Аналогом preg_match является булева функция POSIX-расширения ereg(string pattern, string string [, array regs])

Функция ereg() возвращает TRUE, если совпадение найдено, и FALSE – в противном случае.

Приводимые далее примеры можно тестировать на перечисленных функциях. Например, так:

<?
//строка, в которой нужно что-то найти
$str = "Мой телефонный номер: ".
"33-22-44. Номер моего редактора: ".
"222-44-55 и 323-22-33";
//шаблон, по которому искать.
//Задает поиск семизначных номеров.
$pattern = "/\d{3}-\d{2}-\d{2}/m";
//функция, осуществляющая поиск
$num_match = preg_match_all ($pattern,
                       $str, $result);
//вывод результатов поиска
for ($i=0;$i<$num_match;$i++) 
    echo "Совпадение $i: ".
               $result[0][$i]."<br>";
?>
< Лекция 12 || Лекция 13: 12345 || Лекция 14 >
Дарья Федотова
Дарья Федотова
Сергей Березовский
Сергей Березовский

В рамках проф. переподготовки по программе "Программирование"

Есть курсы, которые я уже прошел. Но войдя в курс я вижу, что они не зачтены (Язык Ассемблера и архитектура ЭВМ, Программирование на С++ для профессионалов). Это как?

Алексей Адов
Алексей Адов
Россия, Санкт-Петербург
Михаил Акимов
Михаил Акимов
Россия, Москвп, МИРЭА, МГУПИ, МИТХТ