Что такое preg match php
Перейти к содержимому

Что такое preg match php

  • автор:

Регулярные выражения в PHP часть 3 (preg_match)

В предыдущей части статьи «Регулярные выражения в PHP (preg_replace) часть 2» мы говорили исключительно о функции preg_replace, которая заменяет часть строки. Но есть ещё функция preg_match, которая выполняет поиск в строке по регулярному выражению. Эта функция возвращает 1, если хотя бы одно совпадение найдено и 0, если не было найдено ни одного. Приведём пример использования:

Функция preg_match применяется нечасто, потому что всего лишь говорит есть или нет подстрока. Но есть ещё функция preg_match_all, которая имеет три параметра и находит все совпадения, записывая их в третий параметр. Звучит сложно, но посмотрим на практике, что это значит:

'; print_r($a); echo '

'; ?>

В результате выполнения такого кода переменная $b станет равна 2, а в переменной $a будет массив с найденными совпадениями. Результат будет такой:

Array ( [0] => Array ( [0] => Тише [1] => мыши ) )

Карманы

У функции preg_match_all есть возможность выгружать не только найденные совпадения, но и найденные вариации, которые называются карманами. Эти карманы появляются, если использовать скобки ( ) Приведём пример:

'; print_r($a); echo '

'; ?>
В этом примере переменная $b примет значение 3, а в переменной $a будет массив:

Array ( [0] => Array ( [0] => Сыр [1] => сыыр [2] => сыыыр ) [1] => Array ( [0] => ы [1] => ыы [2] => ыыы ) )

В первом массиве будут содержаться найденные совпадения, а во втором содержимое первого кармана. Карманов может быть несколько, в зависимости от количества скобок ( ), которые использовались в регулярном выражении.

Скобки автоматически создают карманы. Если же нужно отказаться от создания кармана, то нужно добавить в начало скобок символы «?:«. Тогда в примере выше регулярное выражение примет такой вид «‘#\bс(?:ы+)р\b#iu‘».

Карманы и preg_replace

Функция preg_replace тоже умеет использовать карманы. Их можно подставлять во второй параметр функции, используя порядковый номер и знак $. Таким образом можно заменять части строки так, что содержащиеся в кармане части будут подставляться на замену.

В первый карман попадёт слово «Сыр», во второй «мышь», а в третий «кот». По правилу ‘$3, $1, $2’ результат будет иметь содержимое из 3 кармана, затем запятую и пробел, потом содержимое 1 кармана с запятой и пробелом, и в конце содержимое 2 кармана. Результат будет такой:

кот, Сыр, мышь

Напомним, что регулярными выражениями необходимо использовать только в том случае, если нет никакого другого способа решения.

Ошибки в регулярных выражениях — это очень частое явление. Поэтому прибегайте к этому инструменту только в самых-самых безвыходных ситуациях, когда всё остальное уже опробовано.

Можно обращаться к содержимому кармана непосредственно в регулярном выражении. То есть в карман заносятся данные и тут же достаются. Для этого необходимо поставить слеш \ и затем номер кармана непосредственно в регулярном выражении:

В приведённом примере выражение «#([а-я]+)\1#» сначала заносит в карман любую букву, а котом достаёт её же и ставит после найденной. Эффект получается такой, как будто мы находим повторяющуюся два раза букву и делаем её замену:

Сыр, с!р, с!ыр

Позитивный и негативный просмотр

Функцией preg_replace найденное выражение заменяется полностью на второй параметр. Но что делать, если нам не надо заменять всё найденное, а только часть? Для этого есть позитивный и негативный просмотр.

Представьте, что нужно заменить слово, не заменяя первую букву. Приведём пример реализации:

Результат будет такой:

Тише, мыши, котята на крыше

Хоть буква «к» и стоит в регулярном выражении, но она стоит в специальных скобках (?<=к), которые проверяют наличие буквы, но не подставляют её на замену. Такие скобки называются позитивным просмотром. Можно сделать позитивный просмотр и в конце строки:

Позитивный просмотр (?=е) проверяет, есть ли в конце строки буква «е». Происходит замена и получается такая строка:

Тише, мыши, кот на сыре

Теперь рассмотрим оба примера (просмотр в начале и в конце строки), но в негативном смысле. Негативный просмотр — это противоположность к позитивному и создаётся с помощью скобок (? для поиска символа вначале и (?! ) в конце. То есть он проверяет нет ли такого символа:

Результат будет такой:

Тише, мыши, кот на крышке Мышка, сырок

preg_match_all

Ищет в строке subject все совпадения с шаблоном pattern и помещает результат в массив matches в порядке, определяемом комбинацией флагов flags .

После нахождения первого соответствия последующие поиски будут осуществляться не с начала строки, а от конца последнего найденного вхождения.

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

Искомый шаблон, строка.

Параметр flags регулирует порядок вывода совпадений в возвращаемом многомерном массиве.

Может быть комбинацией следующих флагов (необходимо понимать, что использование PREG_PATTERN_ORDER одновременно с PREG_SET_ORDER бессмысленно): PREG_PATTERN_ORDER

Упорядочивает результаты так, что элемент $matches[0] содержит массив полных вхождений шаблона, элемент $matches[1] содержит массив вхождений первой подмаски, и так далее.

preg_match_all ( «|<[^>]+>(.*)]+>|U» ,
«пример:

это тест

» ,
$out , PREG_PATTERN_ORDER );
echo $out [ 0 ][ 0 ] . «, » . $out [ 0 ][ 1 ] . «\n» ;
echo $out [ 1 ][ 0 ] . «, » . $out [ 1 ][ 1 ] . «\n» ;
?>

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

пример: , 
это тест
пример: , это тест

Таким образом, $out[0] содержит массив полных вхождений шаблона, а $out[1] содержит массив подстрок, содержащихся в тегах.

PREG_SET_ORDER

Упорядочивает результаты так, что элемент $matches[0] содержит первый набор вхождений, элемент $matches[1] содержит второй набор вхождений, и так далее.

preg_match_all ( «|<[^>]+>(.*)]+>|U» ,
«пример:

это тест

» ,
$out , PREG_SET_ORDER );
echo $out [ 0 ][ 0 ] . «, » . $out [ 0 ][ 1 ] . «\n» ;
echo $out [ 1 ][ 0 ] . «, » . $out [ 1 ][ 1 ] . «\n» ;
?>

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

пример: , пример: 
это тест
, это тест

PREG_OFFSET_CAPTURE

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

В случае если флаги не были указаны, по умолчанию используется PREG_PATTERN_ORDER .

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

Замечание:

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

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

Возвращает количество найденных вхождений шаблона (которое может быть и нулем) либо FALSE , если во время выполнения возникли какие-либо ошибки.

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

Версия Описание
5.4.0 Параметр matches стал необязательным.
5.3.6 Возвращает FALSE если offset больше чем длина subject .
5.2.2 Именованные подмаски теперь принимают синтаксис (?) и (?’name’), также как и (?P). Предыдущие версии принимали только (?P).

Примеры

Пример #1 Получение всех телефонных номеров из текста.

Пример #2 Жадный поиск совпадений с HTML-тэгами

preg_match_all ( «/(<([\w]+)[^>]*>)(.*?)()/» , $html , $matches , PREG_SET_ORDER );

foreach ( $matches as $val ) echo «совпадение: » . $val [ 0 ] . «\n» ;
echo «часть 1: » . $val [ 1 ] . «\n» ;
echo «часть 2: » . $val [ 2 ] . «\n» ;
echo «часть 3: » . $val [ 3 ] . «\n» ;
echo «часть 4: » . $val [ 4 ] . «\n\n» ;
>
?>

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

совпадение: полужирный текст часть 1: часть 2: b часть 3: полужирный текст часть 4: matched: нажми часть 1: часть 2: a часть 3: нажми часть 4: 

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

preg_match_all ( ‘/(?P\w+): (?P\d+)/’ , $str , $matches );

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

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

Array ( [0] => Array ( [0] => a: 1 [1] => b: 2 [2] => c: 3 ) [name] => Array ( [0] => a [1] => b [2] => c ) [1] => Array ( [0] => a [1] => b [2] => c ) [digit] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [2] => Array ( [0] => 1 [1] => 2 [2] => 3 ) )

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

  • «Регулярные выражения PCRE»
  • preg_quote() — Экранирует символы в регулярных выражениях
  • preg_match() — Выполняет проверку на соответствие регулярному выражению
  • preg_replace() — Выполняет поиск и замену по регулярному выражению
  • preg_split() — Разбивает строку по регулярному выражению
  • preg_last_error() — Возвращает код ошибки выполнения последнего регулярного выражения PCRE

preg_match

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

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

Искомый шаблон, строка.

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

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

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

Замечание:

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

$subject = «abcdef» ;
$pattern = ‘/^def/’ ;
preg_match ( $pattern , $subject , $matches , PREG_OFFSET_CAPTURE , 3 );
print_r ( $matches );
?>

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

Array ( )

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

$subject = «abcdef» ;
$pattern = ‘/^def/’ ;
preg_match ( $pattern , substr ( $subject , 3 ), $matches , PREG_OFFSET_CAPTURE );
print_r ( $matches );
?>

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

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

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

Внимание

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

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

Версия Описание
5.3.6 Возвращает FALSE если offset больше, чем длина subject .
5.2.2 Именованные подмаски теперь позволяют синтаксис (?) и (?’name’), также как и (?P). Предыдущие версии позволяли только (?P).

Примеры

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

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

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

/* Специальная последовательность \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

// Извлекаем имя хоста из 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 Использование именованных подмасок

$str = ‘foobar: 2008’ ;

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

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

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

Примечания

Подсказка

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

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

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

Поиск данных с помощью функции preg_match

Admin 30.10.2017 , обновлено: 08.08.2020 PHP, PHP Errors

preg_match — является функция поиска в PHP. Если функция preg_replace убирает текст, то с помощью preg_match можно находить конкретные данные и сохранять их в переменную для последующего вывода.

Если нужна функция замены в PHP при поиске данных, то она называется preg_replace.

Функция работает следующим образом.

В первом параметре, с помощью регулярных выражений задаются критерии поиска.

Во втором параметре, содержится информация, в которой необходимо найти данные.

Последний параметр, то куда мы будем сохранять найденные данные.

Найдём все что лежит внутри тега H2:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *