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

В PHP определено несколько функций для работы с регулярными выражениями.

Функция preg_match() имеет следующий синтаксис:

int preg_match (string pattern,

string subject [, array matches [, int flags]])

и предназначена для проверки того, совпадает ли заданная строка subject с заданным регулярным выражением pattern. В качестве результата функция возвращает 1, если совпадения были найдены и 0, если нет. Если при выполнении функции произошла ошибка, то возвращается значение false.

Если при вызове функции был задан необязательный параметр – массив matches, то после работы функции его элементам будут присвоены следующие значения: matches[0] соответствует результату поиска по полному шаблону, matches[1] соответствует результату поиска по первому подшаблону (в круглых скобках), если он есть и т.д. Параметр flags, если он задан, должен иметь значение PREG_OFFSET_CAPTURE. В этом случае matches[0] соответствует результату поиска по полному шаблону, matches[1] соответствует смещению результата поиска относительно начала строки, matches[2] – результату поиска по первому подшаблону (в круглых скобках), если он есть и т.д.

Пример 4.6.125. Использование функции preg_match():

В программе задан следующий фрагмент:

// Получение имени хоста из URL

preg_match("/^(http:\/\/)?([^\/]+)/i",

"https://www.php.net/index.html", $matches);

$host = $matches[2];

// Получение двух последних сегментов имени хоста

preg_match("/[^\.\/]+\.[^\.\/]+$/",$host, $matches);

echo "Host name: ".$matches[0]."\n";

В результате выполнения фрагмента будет выведено:

Функция preg_match_all() имеет следующий синтаксис:

int preg_match_all (string pattern,

string subject, array matches [, int flags])

и осуществляет поиск в строке subject в соответствии с шаблоном pattern и возвращает все имеющиеся совпадения в массиве matches в соответствии с порядком, указанным в параметре flags. Необязательный параметр flags может быть комбинацией следующих значений:

· PREG_PATTERN_ORDER – массив matches[0] будет содержать результаты поиска по полному шаблону, массив matches[1] – результаты поиска по первому подшаблону и т.д. (это значение используется по умолчанию);

· PREG_SET_ORDER – массив matches[0] будет содержать первый набор соответствий, массив matches[1] – второй набор соответствий и т.д.;

· PREG_OFFSET_CAPTURE – каждый элемент массива состоит из найденного соответствия (индекс 0) и значения смещения соответствия относительно начала строки (индекс 1).

Пример 4.6.126. Использование функции preg_match_all():

В программе следующий фрагмент:

// Поиск по всем совпадениям

preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",

"<b>Example: </b><div align=left>This is the test</div>",

$out, PREG_PATTERN_ORDER);

// Вывод найденных совпадений

print $out[0][0].", ".$out[0][1]."\n";

print $out[1][0].", ".$out[1][1]."\n";

Вывод фрагмента:

Если в вызове функции заменить параметр flags на PREG_SET_ORDER, то вывод будет иметь следующий вид:

Функция preg_replace() имеет следующий синтаксис:

mixed preg_replace (mixed pattern,

mixed replacement, mixed subject [, int limit])

Эта функция выполняет поиск по регулярному выражению pattern в строке subject, и каждый найденный фрагмент текста заменяется строкой, заданной в параметре replacement. Если задан параметр limit, то количество заменяемых фрагментов в строке ограничивается указанным числом (если значение параметра не задано или равно -1, то производятся все замены). Если параметр subject является массивом, то поиск и замена выполняются для каждого элемента массива (в этом случае результат также будет массивом). Если и pattern и replacement – массивы, то значение шаблона и замены берутся из элементов массива с одинаковыми индексами (если элементов в replacement меньше, чем в pattern, то найденные элементы заменяются пустыми строками). Если pattern является массивом, а replacement – строкой, то для всех элементов массива pattern производятся одна и та же замена replacement.

Если для шаблона задан модификатор e, то параметр replacement рассматривается не как строка, а как PHP код.

Пример 4.6.127. Использование функции preg_replace():

1. В сценарии задан следующий фрагмент:

// Задание массива шаблонов

$patterns = array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/",

"/^\s*{(\w+)}\s*=/");

// Задание массива замен

$replace = array("\\3/\\4/\\1\\2", "$\\1 =");

// Замена в строке по заданным шаблонам

// и вывод измененной строки

print preg_replace ($patterns, $replace,

"{startDate} = 2002-5-27");

Вывод фрагмента:

2. Вывод тегов элементов тела документа HTML заглавными буквами:

// Исходная строка

$html_body = "<body>The document body</body>";

// Замена тегов в строке

// и вывод измененной строки

print preg_replace ("/(<\/?)(\w+)([^>]*>)/e",

"'\\1'.strtoupper('\\2').'\\3'", $html_body);

Вывод фрагмента:

Функция preg_replace_callback()

mixed preg_replace_callback (mixed pattern,

mixed callback, mixed subject [, int limit])

Выполнение этой функции полностью идентично выполнению функции preg_replace(), за исключением того, что вместо строки или массива замены задается имя функции, которая будет производить обработку найденного соответствия и возвращать замещающую строку или элементы массива.

Функция preg_split() имеет следующий синтаксис:

array preg_split (string pattern,

string subject [, int limit [, int flags]])

В результате выполнения функции строка subject разбивается на части по разделителю, заданному регулярным выражением pattern. При этом количество фрагментов может быть ограничено необязательным параметром limit. Кроме того, эта функция поддерживает необязательный параметр flags, который позволяет контролировать процесс разбиения строки и может принимать следующие значения (или их комбинации с использованием символа "|"):

· PREG_SPLIT_NO_EMPTY – возвращаются только непустые части строк, полученные в результате разбиения;

· PREG_SPLIT_DELIM_CAPTURE – возвращаются также результаты поиска по внутренним регулярным выражениям;

· PREG_SPLIT_OFFSET_CAPTURE – каждый элемент массива состоит из найденного соответствия (индекс 0) и значения смещения соответствия относительно начала строки (индекс 1).

Пример 4.6.128. Использование функции preg_split():

В программе задан следующий фрагмент:

// Исходная строка

$str = 'hypertext programming';

// Преобразование строки в массив

// по заданному шаблону разделителя

$chars = preg_split('/ /', $str, -1,

PREG_SPLIT_OFFSET_CAPTURE);

// Вывод массива $chars

print '$chars: '; print_r($chars);

Массив $chars будет содержать следующие элементы:

Функция preg_quote() имеет следующий синтаксис:

string preg_quote (string str [, string delimiter])

Эта функция ставит перед символами

. \ + *? [ ^ ] $ () { } =! < >:

в строке str символ "\", т.е. превращает метасимволы в регулярном выражении в обычные символы. Если задан параметр delimiter, то перед первым символом строки delimiter в строке str также будет вставлен символ "\" (обычно это используется, если в строке имеются символы, совпадающие с ограничителем регулярного выражения, например, символы "/").

Функция preg_grep() имеет следующий синтаксис:

array preg_grep (string pattern, array input)

Эта функция ищет текст по регулярному выражению pattern в массиве input и возвращает новый массив, содержащий только элементы, в которых были найдены совпадения с заданным регулярным выражением.

Пример 4.6.129. Использование функции preg_grep():

Предложения

// Объявление массива $num_array

$num_array = array(15, 3.57, 4.56, 12, 17.8);

// Проверка массива $num_array и запись

// чисел с плавающей точкой в массив $fl_array

$fl_array = preg_grep ("/^(\d+)?\.\d+$/", $num_array);

// Вывод массива $fl_array

print '$fl_array: '; print_r($fl_array);

помещает все элементы массива $array, содержащие числа с плавающей точкой, в массив $fl_array:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: