Функции Язык программирования PHP

preg_match_all

(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().


Назад Оглавление Вперёд
preg_grep Вверх preg_match

Синтаксис Патэрна

Отличия от Perl

Эти отличия даны относительно Perl 5.005.

  1. По умолчанию пробельным символом считается любой таковой символ, распознаваемый функцией isspace() библиотеки С, хотя возможна компиляция PCRE с альтернативной таблицей типов символов. Нормально isspace() распознаёт space, formfeed, newline, carriage return, horizontal tab и vertical tab. Perl 5 больше не включает vertical tab в набор пробельных символов. Мнемоника \v, которая долгое время была в документации Perl, фактически никогда не распознавалась. Однако сам по себе этот символ рассматривался как пробельный как минимум до версии 5.002. В 5.004 и 5.005 он не соответствует \s.

  2. PCRE не разрешает повторение квантификаторов или опережающих утверждений/lookahead assertions. Perl разрешает их, но они имеют другое значение. Например, (?!a){3} не утверждает, что три последующие символа не "a". Оно просто утверждает три раза, что следующий символ не "a".

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

  4. Хотя двоичные нулевые символы поддерживаются в строке-субъекте, они не допускаются в строке патэрна, поскольку он передаётся как нормальная C-строка, оканчивающаяся нулём. Замена "\\x00" может использоваться в патэрне для представления бинарного нуля.