preg_match

(PHP 4, PHP 5, PHP 7)

preg_matchВыполняет проверку на соответствие регулярному выражению

Описание

preg_match ( string $pattern , string $subject , array &$matches = null , int $flags = 0 , int $offset = 0 ) : int|false

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

Список параметров

pattern

Искомый шаблон в виде строки.

subject

Входная строка.

matches

В случае, если указан дополнительный параметр matches, он будет заполнен результатами поиска. Элемент $matches[0] будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[1] - часть строки, соответствующую первой подмаске и так далее.

flags

flags может быть комбинацией следующих флагов:

PREG_OFFSET_CAPTURE

В случае, если этот флаг указан, для каждой найденной подстроки будет указана ее позиция (в байтах) в исходной строке. Необходимо помнить, что этот флаг меняет формат возвращаемого массива matches в массив, каждый элемент которого содержит массив, содержащий в индексе с номером 0 найденную подстроку, а смещение этой подстроки в параметре subject - в индексе 1.

<?php
preg_match
('/(foo)(bar)(baz)/''foobarbaz'$matchesPREG_OFFSET_CAPTURE);
print_r($matches);
?>

Результат выполнения данного примера:

Array
(
    [0] => Array
        (
            [0] => foobarbaz
            [1] => 0
        )

    [1] => Array
        (
            [0] => foo
            [1] => 0
        )

    [2] => Array
        (
            [0] => bar
            [1] => 3
        )

    [3] => Array
        (
            [0] => baz
            [1] => 6
        )

)

PREG_UNMATCHED_AS_NULL

Если этот флаг передан, несовпадающие подмаски будут представлены значениями null; в противном случае они отображаются в виде пустых строк (string).

<?php
preg_match
('/(a)(b)*(c)/''ac'$matches);
var_dump($matches);
preg_match('/(a)(b)*(c)/''ac'$matchesPREG_UNMATCHED_AS_NULL);
var_dump($matches);
?>

Результат выполнения данного примера:

array(4) {
  [0]=>
  string(2) "ac"
  [1]=>
  string(1) "a"
  [2]=>
  string(0) ""
  [3]=>
  string(1) "c"
}
array(4) {
  [0]=>
  string(2) "ac"
  [1]=>
  string(1) "a"
  [2]=>
  NULL
  [3]=>
  string(1) "c"
}

offset

Обычно поиск осуществляется слева направо, с начала строки. Можно использовать дополнительный параметр offset для указания альтернативной начальной позиции для поиска (в байтах).

Замечание:

Использование параметра offset не эквивалентно замене сопоставляемой строки выражением substr($subject, $offset) при вызове функции preg_match(), поскольку шаблон pattern может содержать такие условия как ^, $ или (?<=x). Сравните:

<?php
$subject 
"abcdef";
$pattern '/^def/';
preg_match($pattern$subject$matchesPREG_OFFSET_CAPTURE3);
print_r($matches);
?>

Результат выполнения данного примера:

Array
(
)

В то время как этот пример

<?php
$subject 
"abcdef";
$pattern '/^def/';
preg_match($patternsubstr($subject,3), $matchesPREG_OFFSET_CAPTURE);
print_r($matches);
?>

выведет следующее:

Array
(
    [0] => Array
        (
            [0] => def
            [1] => 0
        )

)

В качестве альтернативы substr()(), используйте утверждение \G вместо якоря ^ или модификатор A. Оба они работают с параметром offset.

Возвращаемые значения

preg_match() возвращает 1, если параметр pattern соответствует переданному параметру subject, 0 если нет, или false в случае ошибки.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Список изменений

Версия Описание
7.2.0 Теперь константа PREG_UNMATCHED_AS_NULL поддерживается для параметра $flags.

Примеры

Пример #1 Поиск подстроки "php" в тексте

<?php
// Символ "i" после закрывающего ограничителя шаблона означает
// регистронезависимый поиск.
if (preg_match("/php/i""PHP is the web scripting language of choice.")) {
    echo 
"Вхождение найдено.";
} else {
    echo 
"Вхождение не найдено.";
}
?>

Пример #2 Поиск слова "web" в тексте

<?php
/* Специальная последовательность \b в шаблоне означает границу слова,
   следовательно, только изолированное вхождение слова 'web' будет
   соответствовать маске, в отличие от "webbing" или "cobweb" */
if (preg_match("/\bweb\b/i""PHP is the web scripting language of choice.")) {
    echo 
"Вхождение найдено.";
} else {
    echo 
"Вхождение не найдено.";
}

if (
preg_match("/\bweb\b/i""PHP is the website scripting language of choice.")) {
    echo 
"Вхождение найдено.";
} else {
    echo 
"Вхождение не найдено.";
}
?>

Пример #3 Извлечение доменного имени из URL

<?php
// Извлекаем имя хоста из URL
preg_match('@^(?:http://)?([^/]+)@i',
    
"http://www.php.net/index.html"$matches);
$host $matches[1];

// извлекаем две последние части имени хоста
preg_match('/[^.]+\.[^.]+$/'$host$matches);
echo 
"доменное имя: {$matches[0]}\n";
?>

Результат выполнения данного примера:

доменное имя: php.net

Пример #4 Использование именованных подмасок

<?php

$str 
'foobar: 2008';

preg_match('/(?P<name>\w+): (?P<digit>\d+)/'$str$matches);

/* Это также работает в PHP 5.2.2 (PCRE 7.0) и более поздних версиях,
   однако вышеуказанная форма рекомендуется для обратной совместимости */
// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);

print_r($matches);

?>

Результат выполнения данного примера:

Array
(
    [0] => foobar: 2008
    [name] => foobar
    [1] => foobar
    [digit] => 2008
    [2] => 2008
)

Примечания

Подсказка

Не используйте функцию preg_match(), если необходимо проверить наличие подстроки в заданной строке. Используйте для этого strpos() поскольку она выполнят эту задачу гораздо быстрее.

Смотрите также

  • "Регулярные выражения PCRE"
  • preg_quote() - Экранирует символы в регулярных выражениях
  • preg_match_all() - Выполняет глобальный поиск шаблона в строке
  • preg_replace() - Выполняет поиск и замену по регулярному выражению
  • preg_split() - Разбивает строку по регулярному выражению
  • preg_last_error() - Возвращает код ошибки выполнения последнего регулярного выражения PCRE
  • preg_last_error_msg() - Возвращает сообщение об ошибке последней запущеной функции PCRE