PHP : preg_match и preg_match_all
Проверка соответствия введенных текстовых данных шаблону, описанному с использованием регулярных выражений. Для проверки используется встроенная в php функция preg_match_all()...
Проверка соответствия введенных текстовых данных шаблону, описанному с использованием регулярных выражений. Для проверки используется встроенная в php функция preg_match_all(), выполняющая поиск всех соответствий шаблону в исходном тексте. Если использовать функцию preg_match(), то поиск будет продолжаться до первого совпадения, а результатом ее работы будет 0 (совпадений не найдено) или 1 (найдено одно совпадение).
Регулярное выражение следует поместить между двумя символами слэш: /regex/. Для регистронезависимого сравнения необходимо в конце строки добавить модификатор i: /regex/i или в начале выражения добавить модификатор (?i): /(?i)regex/i.
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] содержит массив вхождений первой подмаски, и так далее.
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] содержит второй набор вхождений, и так далее.
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 align="left">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_ORDER2.
Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Дополнительный параметр offset доступен, начиная с PHP 4.3.3.
Замечание: Использование параметра offset не эквивалентно замене сопоставляемой строки выражением substr($subject, $offset) при вызове функции preg_match_all(), поскольку шаблон pattern может содержать такие условия как ^, $ или (?<=x). Вы можете найти соответствующие примеры в описании функции preg_match().
Возвращает количество найденных вхождений шаблона (может быть нулем) либо FALSE, если во время выполнения возникли какие-либо ошибки.
Пример 1. Получение всех телефонных номеров из текста.
preg_match_all("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x", "Call 555-1212 or 1-800-555-1212", $phones); print_r($phones);
Результат работы примера:
Array ( [0] => Array ( ) [1] => Array ( ) )
Пример 2. Жадный поиск совпадений с HTML-тэгами
// Запись \\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>
Пример 3. Выделение кодовой страницы из META
$html="<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\" /> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /> "; preg_match_all('/(<meta\s*http-equiv=[\'\"]Content-Type[\'\"]\s*content=[\'\"][^;]*;\s*charset=([^\"\']*?)(?:"|\;|\')[^>]*>)/i',$html,$arr,PREG_PATTERN_ORDER); print_r($arr);
Результат работы примера:
Array ( [0] => Array ( [0] => [1] => ) [1] => Array ( [0] => [1] => ) [2] => Array ( [0] => windows-1251 [1] => utf-8 ) )