 |
(PHP
3>= 3.0.9, PHP 4) preg_match_all - выполняет глобальный поиск совпадения
регулярного выражения. Описаниеint preg_match_all
(string pattern, string subject, array matches [, int flags]) Ищет в subject
все совпадения с регулярным выражением pattern и помещает их в
matches в порядке, специфицированном в order. После
нахождения первого совпадения последующий поиск продолжается до нахождения последнего
совпадения. flags может быть комбинацией следующих флагов
(обратите внимание, что нет смысла использовать PREG_PATTERN_ORDER
вместе с PREG_SET_ORDER): - PREG_PATTERN_ORDER
Упорядочивает
результаты таким образом, что $matches[0] это массив полных совпадений с патэрном,
$matches[1] это массив строк, совпавших с первым субпатэрном в скобках, и так
далее.
preg_match_all ("|<[^>]+>(.*)</[^>]+>|U", "<b>example:
</b><div align=left>this is a test</div>", $out, PREG_PATTERN_ORDER);
print $out[0][0].", ".$out[0][1]."\n"; print $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] это массив второго набора совпадений, и так далее.
preg_match_all
("|<[^>]+>(.*)</[^>]+>|U", "<b>example: </b><div
align=left>this is a test</div>", $out, PREG_SET_ORDER); print $out[0][0].",
".$out[0][1]."\n"; print $out[1][0].", ".$out[1][1]."\n"; |
Этот
пример выдаст:
<b>example: </b>, example: <div align=left>this is
a test</div>, this is a test |
В данном случае
$matches[0] это первый набор совпадений, а $matches[0][0] содержит текст, совпавший
с полным патэрном, $matches[0][1] содержит текст, совпавший с первым субпатэрном,
и так далее. Аналогично $matches[1] это второй набор совпадений, etc. - PREG_OFFSET_CAPTURE
Если
этот флаг установлен, для каждого возникшего совпадения будет возвращено дополнительное
строковое смещение. Заметьте, что это изменяет return-значение в массиве, где
каждый элемент является массивом, состоящим из совпавшей строки в смещении 0 и
её строкового смещения в subject - в смещении 1. Этот
флаг доступен, начиная с PHP 4.3.0.
Если никакой флаг
упорядочивания не задан, принимается PREG_PATTERN_ORDER. Возвращает
количество полных совпадений с патэрном (это может быть нуль), или FALSE
при ошибке. Пример
1. Получение всех телефонных номеров из текста.preg_match_all
("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x", "Call 555-1212 or 1-800-555-1212",
$phones); |
|
Пример
2. Поиск совпадений с HTML-тэгами (greedy/жадный)//
\\2 это пример обратной ссылки/backreferencing. Это говорит pcre, что // она обязана
совпасть со вторым набором скобок в регулярном выражении, // что будет в данном
случае ([\w]+). Дополнительный backslash необходим, // поскольку строка в двойных
кавычках. $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(). |  |