Php preg_match() function

Мета-символы

Мета характер просто алфавитный символ предшествует обратный слэш , который действует , чтобы дать комбинации особое значение.

Например, вы можете искать большие денежные суммы, используя метасимвол ‘\ d’: / ( +) 000 / , Здесь \ d будет искать любую строку числового символа.

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

Символ Описание
, один символ
\ s символ пробела (пробел, табуляция, новая строка)
\ S не-пробельный символ
\ d цифра(0-9)
\ D — не цифра
\ w символ слова (az, AZ, 0-9, _)
\ W — символ без слова
соответствует одному символу в заданном наборе
соответствует одному символу за пределами заданного набора
( foo | bar | baz ) соответствует любой из указанных альтернатив

str.replace(str|regexp, str|func)

Это универсальный метод поиска-и-замены, один из самых полезных. Этакий швейцарский армейский нож для поиска и замены в строке.

Мы можем использовать его и без регулярных выражений, для поиска-и-замены подстроки:

Хотя есть подводный камень.

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

Вы можете видеть это в приведённом выше примере: только первый заменяется на .

Чтобы найти все дефисы, нам нужно использовать не строку , а регулярное выражение с обязательным флагом :

Второй аргумент – строка замены. Мы можем использовать специальные символы в нем:

Спецсимволы Действие в строке замены
вставляет
вставляет всё найденное совпадение
вставляет часть строки до совпадения
вставляет часть строки после совпадения
если это 1-2 значное число, то вставляет содержимое n-й скобки
вставляет содержимое скобки с указанным именем

Например:

Для ситуаций, которые требуют «умных» замен, вторым аргументом может быть функция.

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

Функция вызывается с аргументами :

  1. – найденное совпадение,
  2. – содержимое скобок (см. главу Скобочные группы).
  3. – позиция, на которой найдено совпадение,
  4. – исходная строка,
  5. – объект с содержимым именованных скобок (см. главу Скобочные группы).

Если скобок в регулярном выражении нет, то будет только 3 аргумента: .

Например, переведём выбранные совпадения в верхний регистр:

Заменим каждое совпадение на его позицию в строке:

В примере ниже две скобки, поэтому функция замены вызывается с 5-ю аргументами: первый – всё совпадение, затем два аргумента содержимое скобок, затем (в примере не используются) индекс совпадения и исходная строка:

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

Или, если мы используем именованные группы, то объект с ними всегда идёт последним, так что можно получить его так:

Использование функции даёт нам максимальные возможности по замене, потому что функция получает всю информацию о совпадении, имеет доступ к внешним переменным и может делать всё что угодно.

Lookahead и lookbehind (опережающая и ретроспективная проверки)

Давайте разберемся, что это такое. Lookahead или же опережающая проверка позволяет выбрать символ или группу символов, если после него идет идет какой-либо символ или группа символов. Lookbehind или же ретроспективная проверка позволяет выбрать символ или группу символов, если до них идет какой-то символ или группа символов.

  • lookahead — опережающая проверка — X(?=Y) — найти Х, при условии, что после него идет Y

  • негативная опрережающая проверка — Х(?!Y)

  • lookbehind — ретроспективная проверка — (?<=Y)X — найти Х, при условии, что до него идет Y

  • негативная ретроспективная проверка — (?<!Y)Xo

Например, дана строка s sw sd st se и мы хотим выбрать букву s, после которой будет идти символ d. Для этого мы можем написать следующее: s(?=d). Таким образом мы как бы проверяем, будет ли идти после символ s символ d.

Также мы можем сделать наоборот и выбрать символ s, если после него НЕ идет символ d. Для этого вместо знака равно мы должны поставить восклицательный знак (!), т.е. написать вот так: s(?!d)

Теперь поговорим о lookbehind. Допустим, у нас есть строка s ws ds ts es и мы хотим выбрать символ s, до которого будет символ d. Для этого мы можем написать так: (?<=d)s

Почему же lookbehind подчеркивается красной линией? Дело в том, что lookbehind не всегда поддерживается и не везде такая регулярка будет работать. Нужно искать способ заменить этот lookbehind, но это зависит от поставленной задачи, поэтому нельзя сказать, как именно ее заменять. Будем надеяться, что в скором временем будет полная поддержка этой возможности.

Чтобы сделать наоборот, то есть выбрать все символы s, до которых НЕ будет идти символ d, нужно опять же поменять знак равно на восклицательный знак: (?<!d)s

Специальные конструкции в регулярках

  • ищет одну любую цифру, — один
    любой символ, кроме цифры
  • соответствует одной любой букве (любого алфавита), цифре
    или знаку подчеркивания . соответствует
    любому символу, кроме буквы, цифры, знака подчеркивания.

Также, есть удобное условие для указания на границу слова: .
Эта конструкция обозначает, что с одной стороны от нее должен стоять символ,
являющийся буквой/цифрой/знаком подчеркивания (), а с
другой стороны — не являющийся. Ну, например, мы хотим найти в тексте слово
«кот». Если мы напишем регулярку , то она
найдет последовательность этих букв в любом месте — например, внутри слова
«скотина». Это явно не то, что мы хотели. Если же мы добавим
условие границы слова в регулярку: , то теперь
искаться будет только отдельно стоящее слово «кот».

Найти все / Заменить все

Эти две задачи решаются в javascript принципиально по-разному.

Начнём с «простого».

Для замены всех вхождений используется метод String#replace.
Он интересен тем, что допускает первый аргумент – регэксп или строку.

Если первый аргумент – строка, то будет осуществлён поиск подстроки, без преобразования в регулярное выражение.

Попробуйте:

Как видите, заменился только один плюс, а не оба.

Чтобы заменить все вхождения, String#replace обязательно нужно использовать с регулярным выражением.

В режиме регулярного выражения плюс придётся экранировать, но зато заменит все вхождения (при указании флага ):

Вот такая особенность работы со строкой.

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

Следующий пример произведёт операции вычитания:

В javascript нет одного универсального метода для поиска всех совпадений.
Для поиска без запоминания скобочных групп – можно использовать String#match:

Как видите, оно исправно ищет все совпадения (флаг у регулярного выражения обязателен), но при этом не запоминает скобочные группы. Эдакий «облегчённый вариант».

В сколько-нибудь сложных задачах важны не только совпадения, но и скобочные группы. Чтобы их найти, предлагается использовать многократный вызов RegExp#exec.

Для этого регулярное выражение должно использовать флаг . Тогда результат поиска, запомненный в свойстве объекта используется как точка отсчёта для следующего поиска:

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

PHP regex character classes

We can combine characters into character classes with the square brackets.
A character class matches any character that is specified in the brackets.

characterclass.php

<?php

$words = ;

$pattern = "/it/";

foreach ($words as $word) {

    if (preg_match($pattern, $word)) {
        echo "$word matches the pattern\n";
    } else {
        echo "$word does not match the pattern\n";
    }
}

We define a character set with two characters.

$pattern = "/it/";

This is our pattern. The is the character class. Note
that we work only with one character at a time. We either consider
f, or s, but not both.

$ php characterclass.php 
sit matches the pattern
MIT does not match the pattern
fit matches the pattern
fat does not match the pattern
lot does not match the pattern

This is the outcome of the script.

We can also use shorthand metacharacters for character classes.
The stands for alphanumeric characters,
for digit, and whitespace characters.

shorthand.php

<?php

$words = ;
$pattern = "/\w{6}/";

foreach ($words as $word) {

    if (preg_match($pattern, $word)) {
        echo "$word matches the pattern\n";
    } else {
        echo "$word does not match the pattern\n";
    }
}

In the above script, we test for words consisting of alphanumeric characters.
The stands for six alphanumeric characters. Only the word
does not match, because it contains non-alphanumeric characters.

php> echo preg_match("#{3}#", "ABC");
1

The pattern stands for three characters that are
not in the class a-z. The «ABC» characters match the condition.

php> print_r(preg_grep("#\d{2,4}#", ));
Array
(
     => 32
     => 234
     => 2345
)

In the above example, we have a pattern that matches 2, 3, and 4 digits.

Повторения (квантификаторы)

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

Повторения символов или комбинаций описываются с помощью квантификаторов (метасимволов, которые задают количественные отношения). Есть два типа квантификаторов: общие (задаются с помощью фигурных скобок ) и сокращенные (сокращения наиболее распространенных квантификаторов). Фигурные скобки задают число повторений предыдущего символа (в этом случае выражение ищет от 1 до 7 идущих подряд букв «x»).

Квантификатор Описанте
a+ Один и более раз a
a* Ноль и более раз a
a? Одна a или пусто
a{3} 3 раза a
a{3,5} От 3 до 5 раз a
a{3,} 3 и более раз a

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

PHP regex alternation

The next example explains the alternation operator . This operator
enables to create a regular expression with several choices.

alternation.php

<?php

$names = ;

$pattern = "/Jane|Beky|Robert/";

foreach ($names as $name) {

    if (preg_match($pattern, $name)) {
        echo "$name is my friend\n";
    } else {
        echo "$name is not my friend\n";
    }
}

We have eight names in the array.

$pattern = "/Jane|Beky|Robert/";

This is the search pattern. The pattern looks for ‘Jane’, ‘Beky’, or
‘Robert’ strings.

$ php alternation.php 
Jane is my friend
Thomas is not my friend
Robert is my friend
Lucy is not my friend
Beky is my friend
John is not my friend
Peter is not my friend
Andy is not my friend

This is the output of the script.

Где писать регулярки?

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

Сразу дам ссылку на сайт, чтобы вы могли уже писать вместе со мной https://www.regextester.com/

Коротко о том, как пользоваться сайтом. Сверху, в графе Regular Expression вы пишете само регулярное выражение, а под ним, в графе Test String вы пишете строку, которую вы хотите фильтровать. Если были найдены соответствия между регулярным выражением и текстом, в тексте эти соответствия будут помечены синим цветом, вы их сразу увидите, даже не сомневайтесь.

PHP regex anchors

Anchors match positions of characters inside a given text.

In the next example, we look if a string is located at
the beginning of a sentence.

anchors.php

<?php

$sentence1 = "Everywhere I look I see Jane";
$sentence2 = "Jane is the best thing that happened to me";

if (preg_match("/^Jane/", $sentence1)) {
    echo "Jane is at the beginning of the \$sentence1\n";
} else {
    echo "Jane is not at the beginning of the \$sentence1\n";
}

if (preg_match("/^Jane/", $sentence2)) {
    echo "Jane is at the beginning of the \$sentence2\n";
} else {
    echo "Jane is not at the beginning of the \$sentence2\n";
}

We have two sentences. The pattern is . The pattern
checks if the ‘Jane’ string located at the beginning of the text.

$ php anchors.php 
Jane is not at the beginning of the $sentence1
Jane is at the beginning of the $sentence2
php> echo preg_match("#Jane$#", "I love Jane");
1
php> echo preg_match("#Jane$#", "Jane does not love me");
0

The pattern matches a string in which the word
Jane is at the end.

Примеры preg_replace PHP

1.

$text = preg_replace("~<a href=\"http://www\.aaa\">+?</a>~",'',$text);

2.

$text = preg_replace('#<!--.*-->#sUi', '', $text);

3.

$text = preg_replace ("~(\\\|\*|\?|\|\(|\\\$|\))~", "",$text);

4.

$text = preg_replace('/(<(+)>)/U', '', $text);

5.

$text = preg_replace('#<script*>.*?</script>#is', '', $text);

6.

$text = str_replace('#39;', '', $text); // удаляем одинарные кавычки
$text = str_replace('&quot;', '', $text); // удаляем двойные кавычки
$text = str_replace('&amp;', '', $text); // удаляем амперсанд
$text = preg_replace('/(()_—«»#\/]+)/', '', $text); // удаляем недоспустимые символы

7.

$text = trim($text); // удаляем пробелы по бокам
$text = preg_replace('/ /', '', $text); // чистим обычные пробелы
$text = preg_replace("/ +/", " ", $text); // множественные пробелы заменяем на одинарные

8.

$text = preg_replace("/(\r\n){3,}/", "\r\n\r\n", $text); // убираем лишние переводы строк (больше 1 строки)

9.

$file = 'image.jpg';
$file = preg_replace("/.*?\./", '', $file); // выведет image

10.

function ProcessText($text)
{
    $text = trim($text); // удаляем пробелы по бокам
    $text = stripslashes($text); // удаляем слэши
    $text = htmlspecialchars($text); // переводим HTML в текст
    $text = preg_replace("/ +/", " ", $text); // множественные пробелы заменяем на одинарные
    $text = preg_replace("/(\r\n){3,}/", "\r\n\r\n", $text); // убираем лишние переводы строк (больше 1 строки)
    $test = nl2br ($text); // заменяем переводы строк на тег
    $text = preg_replace("/^\"(+)\"/u", "$1«$2»", $text); // ставим людские кавычки
    $text = preg_replace("/(«){2,}/","«",$text); // убираем лишние левые кавычки (больше 1 кавычки)
    $text = preg_replace("/(»){2,}/","»",$text); // убираем лишние правые кавычки (больше 1 кавычки)      
    $text = preg_replace("/(\r\n){2,}/u", "</p><p />", $text); // ставим абзацы
    return $text; //возвращаем переменную
}

11.

$string = preg_replace("!<title>(.*?)</title>!si","<НОВЫЙ_ТЕГ>\\1</НОВЫЙ_ТЕГ>",$string);

12.

$text = preg_replace('#(\.|\?|!|\(|\)){3,}#', '\1\1\1', $text);

13.

$string = preg_replace("/^/", "Начало: ", $string); // в начало
$string = preg_replace("/$/", " читать далее...", $string); // в конец

14.

$text = preg_replace('#(?<!\])\bhttp://+#i',
    "<a href=\"$0\" target=_blank><u>Посмотреть на сайте</u></a>",
    nl2br(stripslashes($text)));

15.

$str = preg_replace('/^(.+?)(\?.*?)?(#.*)?$/', '$1$3', $url);

16.

$string = preg_replace("/^/", "
", $string); // в начало всех строк
$string = preg_replace("/$/", "
", $string); // в конец всех строк

17.

// $document на выходе должен содержать HTML-документ.
// Необходимо удалить все HTML-теги, секции javascript,
// пробельные символы. Также необходимо заменить некоторые
// HTML-сущности на их эквивалент.
$search = array ("'<script*?>.*?</script>'si",  // Вырезает javaScript
                 "'<[\/\!]*?*?>'si",           // Вырезает HTML-теги
                 "'()+'",                 // Вырезает пробельные символы
                 "'&(quot|#34);'i",                 // Заменяет HTML-сущности
                 "'&(amp|#38);'i",
                 "'&(lt|#60);'i",
                 "'&(gt|#62);'i",
                 "'&(nbsp|#160);'i",
                 "'&(iexcl|#161);'i",
                 "'&(cent|#162);'i",
                 "'&(pound|#163);'i",
                 "'&(copy|#169);'i",
                 "'&#(\d+);'e");                    // интерпретировать как php-код
$replace = array ("",
                  "",
                  "\\1",
                  "\"",
                  "&",
                  "<",
                  ">",
                  " ",
                  chr(161),
                  chr(162),
                  chr(163),
                  chr(169),
                  "chr(\\1)");
$text = preg_replace($search, $replace, $document);

18.

$html = preg_replace( '/(\S+)@(+)/is', '<a href="mailto:$0">$0</a>', $text);

PHP regex dot metacharacter

The (dot) metacharacter stands for any single character in the text.

single.php

<?php

$words = ;
$pattern = "/.even/";

foreach ($words as $word) {

    if (preg_match($pattern, $word)) {
        echo "$word matches the pattern\n";
    } else {
        echo "$word does not match the pattern\n";
    }
}

In the array, we have five words.

$pattern = "/.even/";

Here we define the search pattern. The pattern is a string. The regular expression
is placed within delimiters. The delimiters are mandatory.
In our case, we use forward slashes as delimiters. Note that we
can use different delimiters if we want. The dot character stands for any single character.

if (preg_match($pattern, $word)) {
    echo "$word matches the pattern\n";
} else {
    echo "$word does not match the pattern\n";
}

We test all five words if they match with the pattern.

$ php single.php 
Seven matches the pattern
even does not match the pattern
Maven does not match the pattern
Amen does not match the pattern
Leven matches the pattern

The Seven and Leven words match our search pattern.

Об ограничении «жадности»

Для понимания, о чем идет речь, лучше сначала ознакомиться с примером:

Здесь шаблон поиска выглядит следующим образом: ‘a’, любой символ один и больше раз, ‘x’. Но выражение сработало не так, как ожидал разработчик: было захвачено максимально возможное число символов, т. е. закончилась не на первом ‘x’, а на последнем.

Данное поведение операторов повторения называют жадностью, т. к. они стремятся забрать как можно больше. Это особенность полезна, но не всегда, поэтому ее можно отменить, ограничив жадность. Для этого надо добавить к оператору повторения знак ‘?’: вместо жадных ‘+’ и » следует написать ‘+?’ и ‘?’, что ограничит эту самую жадность:

В примере выше шаблон поиска выглядит так: ‘a’, потом любой символ один либо больше раз (с ограничением жадности) и ‘x’.

Посредством ‘?’ была ограничена жадность плюсу, поэтому теперь поиск осуществляется до первого совпадения.

Жадность можно ограничивать для всех операторов повторения, включая ‘?’, ‘{}’ — выглядеть это будет так: ‘??’ и ‘{}?’.

Разделители¶

Разделители строк

Метасимвол Находит
любой символ в строке, может включать разделители строк
совпадение нулевой длины в начале строки
совпадение нулевой длины в конце строки
совпадение нулевой длины в начале строки
совпадение нулевой длины в конце строки
похож на но совпадает перед разделителем строки, а не сразу после него, как

Примеры:

RegEx Находит
только если он находится в начале строки
, только если он в конце строки
только если это единственная строка в строке
, , и так далее

Метасимвол совпадает с точкой начала строки (нулевой длины). — в конце строки. Если включен , они совпадают с началами или концами строк внутри текста.

Обратите внимание, что в последовательности нет пустой строки. Примечание

Примечание

Если вы используете , то / также соответствует , , , или .

Метасимвол совпадает с точкой нулевой длины в начале строки, — в конце (после символов завершения строки). Модификатор на них не влияет. тоже самое что но совпадает с точкой перед символами завершения строки (LF and CR LF).

Метасимвол по умолчанию соответствует любому символу, но если вы выключите , то не будет совпадать с разделителями строк внутри строки.

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

Примечание

Многострочная обработка может быть настроена с помощью свойств и .

Таким образом, вы можете использовать разделители стиля Unix или стиль DOS / Windows или смешивать их вместе (как описано выше по умолчанию).

Если вы предпочитаете математически правильное описание, вы можете найти его на сайте www.unicode.org.

Что такое регулярные выражения PHP?

PHP regexp — это мощный алгоритм сопоставления шаблонов, которое может быть выполнено в одном выражении. Регулярные выражения PHP используют арифметические операторы (такие как +, -, ^) для создания сложных выражений.

Для чего используются регулярные выражения:

  • Регулярные выражения упрощают идентификацию строковых данных путем вызова одной функции. Это экономит время при составлении кода;
  • При проверке введенных пользователем данных, таких как адрес электронной почты, домен сайта, номер телефона, IP-адрес;
  • Выделение ключевых слов в результатах поиска;
  • Регулярные выражения могут использоваться для идентификации тегов и их замены.

Основы синтаксиса

В первую очередь стоит заметить, что любая строка сама по себе является регулярным выражением. Так, выражению , очевидно, будет соответствовать строка «Хаха» и только она. Регулярные выражения являются регистрозависимыми, поэтому строка «хаха» (с маленькой буквы) уже не будет соответствовать выражению выше.

Вебинар «Фронтенд, бэкенд, фулстек: как выбрать направление веб-разработки»

18 августа в 13:00, Онлайн, Беcплатно

tproger.ru

События и курсы на tproger.ru

Однако уже здесь следует быть аккуратным — как и любой язык, регулярные выражения имеют спецсимволы, которые нужно экранировать. Вот их список: . Экранирование осуществляется обычным способом — добавлением перед спецсимволом.

Метасимволы

В приведенных выше примерах использовались очень простые шаблоны. Метасимволы позволяют нам выполнять более сложные сопоставления с образцом, например проверять правильность адреса электронной почты. Давайте теперь посмотрим на часто используемые метасимволы.

Метасимвол Описание Пример
. Соответствует любому отдельному символу, кроме новой строки /./ соответствует всему, что имеет один символ
^ Соответствует началу или строке/исключает символы /^PH/ соответствует любой строке, начинающейся с PH
$ Соответствует шаблону в конце строки /ru$/ соответствует it-blog.ru и т.д.
* Соответствует любому нулю (0) или более символов /com*/ соответствует computer, communication и т. д.
+ Требуется, чтобы предшествующие символы появлялись хотя бы раз /yah+oo/ соответствует yahoo
\ Используется для экранирования метасимволов /yahoo+\.com/ трактует точку как буквальное значение
Символы внутри скобках // соответствует abc
a-z Соответствует строчным буквам /a-z/ соответствует cool, happy и т.д.
A-Z Соответствует заглавным буквам /A-Z/ соответствует WHAT, HOW, WHY и т.д.
0-9 Соответствует любому числу от 0 до 9 /0-4/ соответствует 0,1,2,3,4

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

Давайте теперь рассмотрим довольно сложный пример, который проверяет действительность адреса электронной почты.

<?php
$my_email = "name@company.com
	";
if (preg_match("/^+@+\.{2,5}$/", $my_email)) {
echo "$my_email это действительный адрес электронной почты";
}
else
{
  echo "$my_email это не действительный адрес электронной почты";
}
?>

Ещё один реальный пример

Практически на любом современном сайте все адреса вида: https://webshake.ru/post/892

Эти адреса нужно обрабатывать прямо в коде, и понимать, что показать пользователю. Это называется «роутинг» — специальные правила, по которым нужно преобразовать адрес, по которому пришел пользователь, в конкретное действие на стороне сервера. То есть получив адрес вида /post/892 ваш код должен понять, что:

  1. это post, то есть статья
  2. идентификатор этой статьи — 892

Дальше он ищет статью в базе данных с таким идентификатором и возвращает её пользователю.

Вопрос: как это сделать? Да проще простого! Создать список шаблонов для всех страниц сайта. И когда прилетает запрос на /post/+ — то искать статью с каким-то идентификатором. Да, да, вы уже догадались, сделать это можно с помощью регулярок. И это будет вашим домашним заданием.

PHP regex extracting matches

The takes an optional third parameter.
If it is provided, it is filled with the results of the search.
The variable is an array whose first element contains the text that
matched the full pattern, the second element contains
the first captured parenthesized subpattern, and so on.

extract_matches.php

<?php

$times = ;

$pattern = "/(\d\d):(\d\d):(\d\d)/";

foreach ($times as $time) {

    $r = preg_match($pattern, $time, $match);
    
    if ($r) {
        
        echo "The $match is split into:\n";
        
        echo "Hour: $match\n";
        echo "Minute: $match\n";
        echo "Second: $match\n";
    } 
}

In the example, we extract parts of a time string.

$times = ;

We have three time strings in English locale.

$pattern = "/(\d\d):(\d\d):(\d\d)/";

The pattern is divided into three subpatterns using square
brackets. We want to refer specifically to exactly to
each of these parts.

$r = preg_match($pattern, $time, $match);

We pass a third parameter to the
function. In case of a match, it contains text parts of
the matched string.

if ($r) {
    
    echo "The $match is split into:\n";
    
    echo "Hour: $match\n";
    echo "Minute: $match\n";
    echo "Second: $match\n";
} 

The contains the text that matched the full
pattern, contains text that matched the first
subpattern, the second, and
the third.

$ php extract_matches.php 
The 10:10:22 is split into:
Hour: 10
Minute: 10
Second: 22
The 23:23:11 is split into:
Hour: 23
Minute: 23
Second: 11
The 09:06:56 is split into:
Hour: 09
Minute: 06
Second: 56

This is the output of the example.

PHP PRCE functions

We define some PCRE regex functions. They all have a preg prefix.

  • — splits a string by regex pattern
  • — performs a regex match
  • — search and replace string by regex pattern
  • — returns array entries that match the regex pattern

Next we will have an example for each function.

php> print_r(preg_split("@\s@", "Jane\tKate\nLucy Marion"));
Array
(
     => Jane
     => Kate
     => Lucy
     => Marion
)

We have four names divided by spaces. The is a character
class which stands for spaces. The function returns
the split strings in an array.

php> echo preg_match("##", "s");
1

The function looks if the ‘s’ character
is in the character class . The class stands for all
characters from a to z. It returns 1 for success.

php> echo preg_replace("/Jane/","Beky","I saw Jane. Jane was beautiful.");
I saw Beky. Beky was beautiful.

The function replaces all occurrences of
the word ‘Jane’ for the word ‘Beky’.

php> print_r(preg_grep("#Jane#", ));
Array
(
     => Jane
)

The function returns an array of words that
match the given pattern. In this example, only one word is returned in the array.
This is because by default, the search is case sensitive.

php> print_r(preg_grep("#Jane#i", ));
Array
(
     => Jane
     => jane
     => JANE
)

In this example, we perform a case insensitive grep. We put the
modifier after the right delimiter. The returned array has now three words.

Кванторы

Частоту или положение заключенных в скобки символьных последовательностей и одиночных символов можно обозначить специальным символом. Каждый особый персонаж имеет конкретную коннотацию. +, * ,? , {int. range} и $ flags следуют за символьной последовательностью.

# Значение Описание
р + Он соответствует любой строке, содержащей хотя бы один p.
п* Он соответствует любой строке, содержащей ноль или более p.
p ? Он соответствует любой строке, содержащей ноль или более p. Это просто альтернативный способ использования p *.
р {N} Он соответствует любой строке, содержащей последовательность из N p
р {2,3} Он соответствует любой строке, содержащей последовательность из двух или трех p.
p {2,} Он соответствует любой строке, содержащей последовательность не менее двух p.
р $ Он соответствует любой строке с p в конце ее.
^ р Он соответствует любой строке с p в начале ее.

Примеры

Следующие примеры дают понятия о совпадении символов.

Значение Описание
Он соответствует любой строке, не содержащей ни одного символа в диапазоне от a до z и от A до Z.
p.p Он соответствует любой строке, содержащей p, за которой следует любой символ, в свою очередь, за которым следует другой p.
^. {2} $ Он соответствует любой строке, содержащей ровно два символа.
(.*). Он соответствует любой строке, заключенной внутри b и / b.
p ( hp ) * Он соответствует любой строке, содержащей ap, а затем ноль или более экземпляров последовательности php.
Добавить комментарий

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

Adblock
detector