preg_match
(PHP 4, PHP 5, PHP 7)
preg_match — Выполняет проверку на соответствие регулярному выражению
Описание
$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', $matches, PREG_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', $matches, PREG_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, $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);
?>Результат выполнения данного примера:
Array ( )
В то время как этот пример
<?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, substr($subject,3), $matches, PREG_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