boolean preg_match(string pattern, string text, array matches, integer flags)
Функция preg_match (листинг 12.80) представляет собой аналог функции ereg, совместимый с Perl. Она оценивает аргумент pattern как регулярное выражение и пытается отыскать совпадения в данных, переданных аргументом text. Если задан необязательный аргумент matches, в массив добавляется каждое новое совпадение. Значение TRUE возвращается, если будет найдено как минимум одно совпадение, в противном случае возвращается значение FALSE.
Первый элемент массива matches, имеющий нулевой индекс, должен содержать совпадения для всего регулярного выражения. Последующие элементы этого массива содержат совпадения для подвыражений. В примере эти выражения взяты в скобки.
Для того чтобы функция preg_match возвращала смещение каждого найденного совпадения, аргумент flags должен иметь значение PREG_OFFSET_CAPTURE.

Листинг 12.80. Функция preg_match

<?php
// показать пользовательского агента print(" Пользовательский агент: {$_SERVER['HTTP_USER_AGENT']}<br>n");
// сделать попытку проанализировать пользовательского агента if(preg_match("/*(.+)/([0-9]).([0-9]+)/", $_SERVER['HTTP_USER_AGENT'], $matches))
{
print("Полное совпадение: $matches[0]<br>n"); print("Браузер: $matches[1]<br>n"); print("Версия: $matches[2]<br>n"); print("Релиз: $matches[3]<br>n");
}
else
{
print(" Пользовательский агент не распознан");
}

integer preg_match_all (string pattern, string text, array matches, integer order)
Функция preg_match_all (листинг 12.81) подобна функции preg_match. Данные, переданные аргументом text, сравниваются с данными шаблона pattern, однако вместо завершения работы после обнаружения первого соответствия продолжается поиск последующих соответствий. Указание аргумента matches необходимо, и он принимает двумерный массив. Метод заполнения массива задается аргументом order. Ему могут задаваться две константы: PREG_PATTERN_ORDER (значение по умолчанию) и PREG_SET_ORDER. Этот флаг можно комбинировать с PREG_OFFSET_CAPTURE. Необходимо установить количество совпадений по полному шаблону.
Если задано значение PREG_PATTERN_ORDER, первый элемент массива matches будет содержать массив всех совпадений по полному шаблону. Другие элементы массива будут содержать массивы совпадений по субшаблонам. Если задано значение PREG_SET_ORDER, каждый элемент массива matches будет содержать массив, организованный наподобие массивов, созданных функцией preg_match. Первый элемент хранит полностью соответствующую строку. Все последующие элементы содержат совпадения по субшаблонам относительно этого совпадения. Если задано значение PREG_OFFSET_CAPTURE, возвращается смещение каждого совпадения.

Листинг 12.81. Функция preg_match_all

<?php
// создать тестовые данные
$paragraph = "Это <Ь>короткий</Ь> абзац. Несколько "; $paragraph .= "<Ь>слов</Ь> и <Ь>несколько фраз</Ь>, "; $paragraph .= "выделенных тегами <b>bold</b>. "; /*
** для поиска слов, выделенных жирным шрифтом, использовать PREG_PATTERN_ORDER
*/
preg_match_all("|<[*>]+>(.*)</[*>]+>|", $paragraph,
$match, PREG_PATTERN_ORDER); // распечатать полное совпадение
print("<b>Совпадения по субшаблонам</b>:<br>n"),• for($i=0; $i < count($match[0]); $i++)
{
print(htmlentities($match[0][$i]) . "<br>n");
}
print("<b>Совпадения по субшаблонам</b>:<br>n"),• for($i=0; $i < count($match[1]); $i++)
{
print(htmlentities($match[0][$i]) . "<br>n");
}
/*
** использовать PREG_SET_ORDER для поиска слов, выделенных жирным шрифтом
*/
preg_match_all("|<[*>]+>(.*)</[*>]+>|", $paragraph,
$match, PREG_SET_ORDER); foreach($match as $m)
{
print(htmlentities($m[0])); for($i=1; $i < count($m); $i++)
{
print(" (".htmlentities($m[$i]).")");
}
print("<br>n");

string preg_quote(string text, string delimiter)
Функция preg_quote возвращает значение, переданное аргументом text, с обратными косыми перед символами, имеющими специальное значение для функций этого раздела. Специальными символами являются
• + * ? [ Л ] $ ( ) { } = ! < > | :
Необязательный аргумент delimiter устанавливает заданный вами ограничитель.
string preg_replace(string pattern, string replacement, string text, integer limit)
Функция preg_replace (листинг 12.82) представляет собой аналог функции ereg_replace, совместимый с Perl. Она производит замену данных, переданных аргументом text и совпадающих с шаблоном, заданным аргументом pattern, значениями, которые заданы аргументом replacement. Само значение аргумента text не изменяется, а возвращается его измененная версия.
Если аргумент pattern содержит подвыражения в скобках, аргумент replacement должен содержать специальный код, определяющий, какое подвыражение будет заменяться. Эта форма использует две обратные косые черты с последующей одной цифрой от 0 до 9. Нуль соответствует всему выражению, а цифры 1-9 соответствуют совпадениям первых девяти подвыражений. Подвыражения нумеруются слева направо, что соответствует вложенным подвыражениям. Необязательным аргументом limit задается максимальное количество замен.

| Листинг 12.82. Функция preg_replace_
<?php
// поменять переводы строк на теги разрыва
$text = "строка1nстрока2nстрока3n";
print(preg_replace("|n|", "<br>", $text));
print("<hr>n");
//перемещать эти слова
$text = "one two three four";
print(preg_replace("|([a-z]+) ([a-z]+) ([a-z]+) ([a-z]+)|", "\4 \2 \1 \3", $text));
?>