создание и продвижение сайта (вбиваю в ТОП-10, как гвозди)Настройка и сопровождение платной рекламы яндекс.директ

PHP. Руководство по PHP. 2005

preg_match_all

Пред.

След.

preg_match_all

(PHP 3 >= 3.0.9, PHP 4, PHP 5)preg_match_all -- Выполняет глобальный поиск шаблона в строке

Описание

int preg_match_all (string pattern, string subject, array &matches [, int flags [, int offset]])

Ищет в строке subject все совпадения с шаблоном

pattern и помещает результат в массив

matches в порядке, определяемом комбинацией флагов

flags.

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

не с начала строки, а от конца последнего найденного вхождения.

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

(необходимо понимать, что использование PREG_PATTERN_ORDER одновременно с PREG_SET_ORDER бессмысленно):

PREG_PATTERN_ORDER

Если этот флаг установлен, результат будет упорядочен следующим образом:

элемент $matches[0] содержит массив полных вхождений шаблона,

элемент $matches[1] содержит массив вхождений первой подмаски, и так далее.

<?php

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

"<b>example: </b><div align=left>this is a test</div>",

$out, PREG_PATTERN_ORDER);

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

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

?>

Результат работы примера:

<b>example: </b>, <div align=left>this is a test</div>

example:, this is a test

Как мы видим, $out[0] содержит массив полных вхождений шаблона,

а элемент $out[1] содержит массив подстрок, содержащихся в тегах.

PREG_SET_ORDER

Если этот флаг установлен, результат будет упорядочен следующим образом:

элемент $matches[0] содержит первый набор вхождений,

элемент $matches[1] содержит второй набор вхождений, и так далее.

<?php

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

"<b>example: </b><div align=\"left\">this is a test</div>",

$out, PREG_SET_ORDER);

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

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

?>

Результат работы примера:

<b>example: </b>, example:

<div>this is a test</div>, this is a test

В таком случае массив $matches[0] содержит первый набор вхождений, а именно:

элемент $matches[0][0] содержит первое вхождение всего шаблона,

элемент $matches[0][1] содержит первое вхождение первой подмаски, и так далее.

Аналогично массив $matches[1] содержит второй набор вхождений, и так для каждого найденного набора.

PREG_OFFSET_CAPTURE

- В случае, если этот флаг указан, для каждой найденной подстроки будет указана

ее позиция в исходной строке. Необходимо помнить, что этот флаг меняет

формат возвращаемых данных: каждое вхождение возвращается в виде массива,

в нулевом элементе которого содержится найденная подстрока, а в первом - смещение.

Данный флаг доступен в PHP 4.3.0 и выше.

В случае, если никакой флаг не используется, по умолчанию используется

PREG_PATTERN_ORDER.

Поиск осуществляется слева направо, с начала строки. Дополнительный параметр

offset может быть использован для указания альтернативной

начальной позиции для поиска. Дополнительный параметр

offset доступен, начиная с PHP 4.3.3.

Замечание:

Использование параметра offset не эквивалентно

замене сопоставляемой строки выражением substr($subject, $offset)

при вызове функции preg_match_all(), поскольку

шаблон pattern может содержать такие условия как

^, $ или (?<=x).

Вы можете найти соответствующие примеры в описании функции preg_match().

Возвращает количество найденных вхождений шаблона (может быть нулем) либо

FALSE, если во время выполнения возникли какие-либо ошибки.

Пример 1. Получение всех телефонных номеров из текста.

<?php

preg_match_all("/\(? (\d{3})? \)? (?(1) [\-\s]) \d{3}-\d{4}/x",

"Call 555-1212 or 1-800-555-1212", $phones);

?>

Пример 2. Жадный поиск совпадений с HTML-тэгами

<?php

// Запись \\2 является примером использования ссылок на подмаски.

// Она означает необходимость соответствия подстроки строке, зафиксированной

// второй подмаской, в нашем примере это ([\w]+).

// Дополнительный слеш необходим, так как используются двойные кавычки.

$html = "<b>bold text</b><a href=howdy.html>click me</a>";

preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);

for ($i=0; $i< count($matches[0]); $i++){

echo "matched: " . $matches[0][$i]. "\n";

echo "part 1: " . $matches[1][$i]. "\n";

echo "part 2: " . $matches[3][$i]. "\n";

echo "part 3: " . $matches[4][$i]. "\n\n";

}

?>

Результат работы примера:

matched: <b>bold text</b>

part 1: <b>

part 2: bold text

part 3: </b>

matched: <a href=howdy.html>click me</a>

part 1: <a href=howdy.html>

part 2: click me

part 3: </a>

Смотрите также preg_match(),

preg_replace(),

и preg_split().

Пред.

Начало

След.

preg_grep

Уровень выше

preg_match

Отвечу на любые вопросы. С уважением, Дмитрий Владимирович.

Ваше письмо×
Free Web Hosting