Регулярные выражения. Функции для работы с регулярными выражениями

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

Базовый синтаксис и создание регулярных выражений

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

Регулярное выражение — это шаблон, применяемый к заданному тексту слева направо. Большая часть символов сохраняет свое значение в шаблоне и означает совпадение с соответствующим символом. Так регулярное выражение содержащее обычный текст, например "грам", соответствует строке, содержащей указанную подстроку, например "программирование".

В Perl для регулярного выражения обязательно задание границ. Так приведенный выше пример можно написать следующим образом:

"/грам/"

Символ / применяется для задания границ регулярного выражения, т.е регулярное выражение действует до тех пор, пока не встретит второй символ прямого слеша(/). После регулярного выражения следуют модефикаторы шаблона — инструкции, действующие на все регулярное выражение. Мы рассмотрим только один модефикатор i. При его использовании поиск по регулярному выражению осуществляется без учета регистра. Так рассмотренный выше пример можно записать следующим образом:

"/грам/i"

Данное выражение будет соответствовать как строке "программирование", так и строке "ПРОГРАММИРОВАНИЕ".

Остальными модефикаторами можно ознакомиться в документации РНР, которая доступна для свободной загрузки с адреса http://www.php.net. Данный раздел документации переведен на русский язык.

Рассмотренное регулярное выражение осуществляет поиск по всему тексту, но чаще следует привязать регулярное выражение к началу слова, т.е. чтобы регулярное выражение "/грам/i" соответствовало строке, начинающейсясо слова "граммпластинка", но не подходило бы слову "программировние". Для этого используется символ ^, соответствующий началу строки:

"/^грам/i"

Знак доллара $ означает конец строки:

"/^граммпластинка$/i"

  Это регулярное выражение соответствует любой строке "граммпластинка", но не подходит строке "граммпластинка — это вам не программирование", т.к. после искомого слова идет текст.

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

"/^$/i"

соответствует пустой строке.

В поисковой строке может понадобиться найти подстроку, содержащую символ /, который у нас используется для обозначения границ. В этом случае необходимо прибегнуть к экранированию этого символа с помощью символа обратного слеша (\). Так у подстроки "Программирование/ РНР" регулярное выражение выглядит так:

"/программирование\ /php/i"

Eсли символ /встречается часто в поисковой строке (например, в HTML-тексте), то можно изменить границы регулярного выражения, в качестве них может выступать любой другой символ, например, следующее регулярное выражение эквивалентно только что рассмотренному:

"|программирование/php|i"

   Использование символа вертикальной черты (|) в качестве границы слова не всегда приемлемо, т.к. он может присутствовать в регулярном выражении для задания альтернативных масок:

"/abc|абв/"

Этому регулярнову выражению соответствует любая строка, содержащая подстроки "abc" или "абв". Вертикальную черту удобно применять при проверке расширений и имен файлов, зон доменных имен и т.д. К примеру, следующее регулярное выражение проверяет, содержатся ли в строке подстроки "ru", "com" или "net":

"/ru|com|net/"

Это выражение соответствует любой строке, которая содержит подстроку abc.

Подстроки регулярных выражениях можно групперовать при помощи скобок:

"/домен - (ru|com|net)/i"

Это регулярное выражение будет соответствовать строке вида "домен - ru", вместо ru может быть как com, так и net. Если необходимо использовать скобки как часть искомой строки, их следует экранировать. Так для поиска подстроки "программирование (РНР)" следует использовать следующее регулярное выражение:

"/программирование \(РНР\)i"

Скобки при программировании в РНР и Perl имеют еще одно значение помимо группировки символов. Все найденные в скобках выражения сохраняются интерпретатором, и к ним можно обратиться при замене или поиске по номеру скобки \\1, \\2 и т.д.

Для задания класса символов используются квадратные скобки ([ ]).Они ограничивают поиск теми символами, в которые они заключены:

"/[abc]/"

Этому регулярному выражению соответствует подстрока, содержащая один символ: либо а, либо b, либо с.

Так для создания регулярного выражения, соответствующего всем буквам русского алфавита, можно, конечно, перечислить все буквы в регулярном выражении. Это допустимо, но утомительно. Более коротко такое регулярное выражение можно записать следующим образом:

"/[а-Я ]/"

Данное выражение подходит всем буквам русского алфавита, поскольку любые два символа, разделяются дефисом, задают соответствие диапазону символов, находящихся между ними. Регулярное выражение "/[а-Я ]/" описывает символы как нижнего, так и верхнего регистров, поэтому более подробно это выражение можно записать так:

"/[а-яА-Я ]/"

Точно таким же образом задаются регулярные выражения, соответствующие цифре:

"/[0-9 ]/" или

"/[0123456789]/"

Оба выражения эквивалентны.

В регулярных выражениях действуют также экранирование, применение обратного слеша с определенными символами, что приводит к их специальной интерпретации:

Рассмотренное выше регулярное выражение для числа можно записать следующим образом:

"/[\d]/"

Для исключения класса символов из поиска первым ставится символ ^, который в квадратных скобках действует уже не как указатель границы строки, а как отрицание:

"[^0-9]"

Это регулярное выражение отвечает любому символу, не содержащимуся в диапазоне 0-9, т.е. все что угодно, только не цифра.

Классы символов \d, \s и т.п. могут применяться в любой части регулярного выражения, а не только в квадратных скобках, т.е. вполне допустимо выражение вида "/\d/".

Выражения в квадратных скобках соответствует только одному символу и часто принимается совместно с так называемыми квантификаторами. Это символы ?, +, *, которые следуют сразу за символом и изменяют число вхождений конкретного символа в строку:

Символ ? позволяет сократить выражение вида

"программирование|программирование \/РНР/i"

до

"/программирование (РНР)?/i"

Метасимвол + обозначает один или несколько экземпляров элемента непосредственно предшествующего элемента, а * — любое количество экземпляров элемента, в том числе и нулевое. Так, если необходимо найти подстроку, содержащую одну или более цифр, следует воспользоваться выражением вида

"/[\d]+/"

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

"/^[\d]*S/"

соответствует пустой строке, либо строке, содержащей только цифры, причем их колличество не ограничено.

Помимо круглых и квадратных скобок в регулярных выражениях так же применяются фигурные скобки {}. Они предназначены для указания чисел или диапазона чисел повторения элемента:

Для указания колличества вхождений не одиночного символа, а их последовательности, используются круглые скобки:

Функции для работы с регулярными выражениями

Если необходимо найти либо сосчитать все совпадения, следует воспользоваться функцией preg_match_all().

Функция preg_match() возвращает количество найденных вхождений шаблона (может быть нулем) либо false, если во время выполнения возникли какие-либо ошибки.

Обобщением функций preg_match() и preg_match_all() является функция preg_grer().




  • Другие |

Похожие материалы по теме: Регулярные выражения

назадвверхвперед
Rambler's Top100