Php preg_match
Содержание:
- Буквы, цифры, символы
- PHP regex dot metacharacter
- Скобки в регулярных выражениях
- Практические примеры сложных регулярных выражений
- Introduction to the PHP preg_match() function
- regexp.exec(str)
- Строковые методы, поиск и замена
- Метасимволы
- Повторы¶
- Операторы повторения
- PHP regex anchors
- Экранируем спецсимволы
- Getting Started With Regular Expressions
- Бекслеши
- Метасимволы
- PHP regex quantifiers
- Escape-знаки
Буквы, цифры, символы
В регулярных выражениях существуют два вида символов: обозначающие сами себя и символы, которые называют командами (спецсимволы).
Цифры и буквы обозначают сами себя, зато точка — спецсимвол, обозначающий «любой символ». Смотрим примеры:
По сути, в коде выше не существует разницы между функциями preg_replace и str_replace – функционируют они одинаково, разница заключается лишь в ограничителях.
В следующем примере можно увидеть, как использовался спецсимвол «точка» — такое уже нельзя сделать с помощью str_replace:
Раз точка — любой символ, то под регулярку подпадут все подстроки, причем по следующему шаблону: буква ‘x’, потом любой символ, потом снова ‘x’. Первые четыре подстроки попали под данный шаблон (xax xsx x&x x-x), поэтому они заменились на ‘!’. Последняя подстрока (xaax) не подпала по той причине, что внутри (между буквами ‘x’) находится не один, а два символа.
Раз точка — любой символ, а в регулярке мы видим 2 точки подряд, то под регулярку подпадут все подстроки по следующему шаблону: буква ‘x’, потом 2 любых символа, потом снова ‘x’. Первая подстрока не подпадет, т. к. она содержит лишь один символ между буквами ‘x’, в то время как последняя подстрока (xabx) шаблону соответствует.
Что тут важно запомнить: цифры и буквы обозначают сами себя, точка же заменяет любой символ. Также важно следующее: для функции preg_match точка на деле обозначает любой символ за исключением перевода строки
Дабы точка обозначала и его, необходим модификатор s.
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.
Скобки в регулярных выражениях
Давай повторим, что обозначают разные виды скобок:
- Фигурные скобки задают число повторений предыдущего
символа — в этом примере выражение ищет от 1 до 5 идущих подряд
букв «a» - Квадратные скобки означают «один любой из
этих символов», в данном случае — буквы a, b, c, x, y, z или
цифра от 0 до 5. Внутри квадратных скобок не работают другие спецсимволы
вроде или — они обозначают обычный символ. Если
в квадратных скобках в начале стоит символ то смысл меняется
на противоположный: «любой один символ, кроме указанных» —
например значит «один любой символ,
кроме a, b или c». - Круглые скобки группируют символы и выражения. Например в
выражении знак «плюс» относится только
к букве c и это выражение ищет слова вроде abc, abcc, abccc. А если
поставить скобки то квантифиактор плюс относится
уже к последовательности и выражение ищет слова
abc, abcbc, abcbcbc
Примечание: в квадратных скобках можно указывать диапазоны
символов, но помни, что русская буква ё идет отдельно от
алфавита и чтобы написать «любая русская буква»,
надо писать .
Практические примеры сложных регулярных выражений
Теперь, когда вы знаете теорию и основной синтаксис регулярных выражений в PHP, пришло время создать и проанализировать некоторые более сложные примеры.
1) Проверка имени пользователя с помощью регулярного выражения
Начнем с проверки имени пользователя. Если у вас есть форма регистрации, вам понадобится проверять на правильность имена пользователей. Предположим, вы не хотите, чтобы в имени были какие-либо специальные символы, кроме «» и, конечно, имя должно содержать буквы и возможно цифры. Кроме того, вам может понадобиться контролировать длину имени пользователя, например от 4 до 20 символов.
Сначала нам нужно определить доступные символы. Это можно реализовать с помощью следующего кода:
После этого нам нужно ограничить количество символов следующим кодом:
{4,20}
Теперь собираем это регулярное выражение вместе:
^{4,20}$
В случае Perl-совместимого регулярного выражения заключите его символами ‘‘. Итоговый PHP-код выглядит так:
<?php $pattern = '/^{4,20}$/'; $username = "demo_user-123"; if (preg_match($pattern, $username)) { echo "Проверка пройдена успешно!"; } else { echo "Проверка не пройдена!"; } ?>
2) Проверка шестнадцатеричного кода цвета регулярным выражением
Шестнадцатеричный код цвета выглядит так: , также допустимо использование краткой формы, например . В обоих случаях код цвета начинается с и затем идут ровно 3 или 6 цифр или букв от a до f.
Итак, проверяем начало кода:
^#
Затем проверяем диапазон допустимых символов:
После этого проверяем допустимую длину кода (она может быть либо 3, либо 6). Полный код регулярного выражения выйдет следующим:
^#(({3}$)|({6}$))
Здесь мы используем логический оператор, чтобы сначала проверить код вида , а затем код вида . Итоговый PHP-код проверки регулярным выражением выглядит так:
<?php $pattern = '/^#(({3}$)|({6}$))/'; $color = "#1AA"; if (preg_match($pattern, $color)) { echo "Проверка пройдена успешно!"; } else { echo "Проверка не пройдена!"; } ?>
3) Проверка электронной почты клиента с использованием регулярного выражения
Теперь давайте посмотрим, как мы можем проверить адрес электронной почты с помощью регулярных выражений. Сначала внимательно рассмотрите следующие примеры адресов почты:
john.doe@test.com john@demo.ua john_123.doe@test.info
Как мы можем видеть, символ является обязательным элементом в адресе электронной почты. Помимо этого должен быть какой-то набор символов до и после этого элемента. Точнее, после него должно идти допустимое доменное имя.
Таким образом, первая часть должна быть строкой с буквами, цифрами или некоторыми специальными символами, такими как . В шаблоне мы можем написать это следующим образом:
^+
Доменное имя всегда имеет, скажем, имя и tld (top-level domain) – т.е, доменную зону. Доменная зона – это , , и тому подобное. Это означает, что шаблон регулярного выражения для домена будет выглядеть так:
+\.{2,5}$
Теперь, если мы соберем все в кучу, то получим полный шаблон регулярного выражения для проверки адреса электронной почты:
^+@+\.{2,5}$
В коде PHP эта проверка будет выглядеть следующим образом:
<?php $pattern = '/^+@+\.{2,5}$/'; $email = "john_123.doe@test.info"; if (preg_match($pattern, $email)) { echo "Проверка пройдена успешно!"; } else { echo "Проверка не пройдена!"; } ?>
Надеемся, что сегодняшняя статья помогла вам при знакомстве с регулярными выражениями в PHP, а практические примеры пригодятся вам при использовании регулярных выражений в собственных PHP скриптах.
-
3911
-
35
-
Опубликовано 16/04/2019
-
PHP, Уроки программирования
Introduction to the PHP preg_match() function
The finds the string for a match to a regular expression. The function stops searching as long as it finds the first match.
Here’s the syntax of the function:
The function accepts the following parameters:
- a string that specifies a pattern to search.
- is an input string.
- is an array that stores the search results. The array is optional. If there is a match, the will contain the text that matches the whole pattern, will contain the text that matches the first capturing group, and so on.
- is a combination of the following flags: and . More on these flags in the example below.
- is the position that the function will start searching. By default, the starts searching from the beginning of the string. Note that the is in bytes.
The function returns if it finds a match, if it doesn’t, or on failure.
regexp.exec(str)
Метод ищет совпадение с в строке . В отличие от предыдущих методов, вызывается на регулярном выражении, а не на строке.
Он ведёт себя по-разному в зависимости от того, имеет ли регулярное выражение флаг .
Если нет , то возвращает первое совпадение в точности как . Такое поведение не даёт нам ничего нового.
Но если есть , то:
- Вызов возвращает первое совпадение и запоминает позицию после него в свойстве .
- Следующий такой вызов начинает поиск с позиции , возвращает следующее совпадение и запоминает позицию после него в .
- …И так далее.
- Если совпадений больше нет, то возвращает , а для устанавливается значение .
Таким образом, повторные вызовы возвращают одно за другим все совпадения, используя свойство для отслеживания текущей позиции поиска.
В прошлом, до появления метода в JavaScript, вызов в цикле использовали для получения всех совпадений с их позициями и группами скобок в цикле:
Это работает и сейчас, хотя для современных браузеров , как правило, удобнее.
Мы можем использовать для поиска совпадения, начиная с нужной позиции, если вручную поставим .
Например:
Если у регулярного выражения стоит флаг , то поиск будет вестись не начиная с позиции , а только на этой позиции (не далее в тексте).
В примере выше заменим флаг на . Ничего найдено не будет, поскольку именно на позиции слова нет:
Это удобно в тех ситуациях, когда мы хотим «прочитать» что-то из строки по регулярному выражению именно на конкретной позиции, а не где-то далее.
Строковые методы, поиск и замена
Следующие методы работают с регулярными выражениями из строк.
Все методы, кроме replace, можно вызывать как с объектами типа regexp в аргументах, так и со строками, которые автоматом преобразуются в объекты RegExp.
Так что вызовы эквивалентны:
var i = str.search(/\s/) var i = str.search("\\s")
При использовании кавычек нужно дублировать \ и нет возможности указать флаги. Если регулярное выражение уже задано строкой, то бывает удобна и полная форма
var regText = "\\s" var i = str.search(new RegExp(regText, "g"))
Возвращает индекс регулярного выражения в строке, или -1.
Если Вы хотите знать, подходит ли строка под регулярное выражение, используйте метод (аналогично RegExp-методы ). Чтобы получить больше информации, используйте более медленный метод (аналогичный методу ).
Этот пример выводит сообщение, в зависимости от того, подходит ли строка под регулярное выражение.
function testinput(re, str){ if (str.search(re) != -1) midstring = " contains "; else midstring = " does not contain "; document.write (str + midstring + re.source); }
Если в regexp нет флага , то возвращает тот же результат, что .
Если в regexp есть флаг , то возвращает массив со всеми совпадениями.
Чтобы просто узнать, подходит ли строка под регулярное выражение , используйте .
Если Вы хотите получить первый результат — попробуйте r.
В следующем примере используется, чтобы найти «Chapter», за которой следует 1 или более цифр, а затем цифры, разделенные точкой. В регулярном выражении есть флаг , так что регистр будет игнорироваться.
str = "For more information, see Chapter 3.4.5.1"; re = /chapter (\d+(\.\d)*)/i; found = str.match(re); alert(found);
Скрипт выдаст массив из совпадений:
- Chapter 3.4.5.1 — полностью совпавшая строка
- 3.4.5.1 — первая скобка
- .1 — внутренняя скобка
Следующий пример демонстрирует использование флагов глобального и регистронезависимого поиска с . Будут найдены все буквы от А до Е и от а до е, каждая — в отдельном элементе массива.
var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; var regexp = //gi; var matches = str.match(regexp); document.write(matches); // matches =
Метод replace может заменять вхождения регулярного выражения не только на строку, но и на результат выполнения функции. Его полный синтаксис — такой:
var newString = str.replace(regexp/substr, newSubStr/function)
- Объект RegExp. Его вхождения будут заменены на значение, которое вернет параметр номер 2
- Строка, которая будет заменена на .
- Строка, которая заменяет подстроку из аргумента номер 1.
- Функция, которая может быть вызвана для генерации новой подстроки (чтобы подставить ее вместо подстроки, полученной из аргумента 1).
Метод не меняет строку, на которой вызван, а просто возвращает новую, измененную строку.
Чтобы осуществить глобальную замену, включите в регулярное выражение флаг .
Если первый аргумент — строка, то она не преобразуется в регулярное выражение, так что, например,
var ab = "a b".replace("\\s","..") // = "a b"
Вызов replace оставил строку без изменения, т.к искал не регулярное выражение , а строку «\s».
В строке замены могут быть такие спецсимволы:
Pattern | Inserts |
Вставляет «$». | |
Вставляет найденную подстроку. | |
Вставляет часть строки, которая предшествует найденному вхождению. | |
Вставляет часть строки, которая идет после найденного вхождения. | |
or | Где или — десятичные цифры, вставляет подстроку вхождения, запомненную -й вложенной скобкой, если первый аргумент — объект RegExp. |
Если Вы указываете вторым параметром функцию, то она выполняется при каждом совпадении.
В функции можно динамически генерировать и возвращать строку подстановки.
Первый параметр функции — найденная подстрока. Если первым аргументом является объект , то следующие параметров содержат совпадения из вложенных скобок. Последние два параметра — позиция в строке, на которой произошло совпадение и сама строка.
Например, следующий вызов возвратит XXzzzz — XX , zzzz.
function replacer(str, p1, p2, offset, s) { return str + " - " + p1 + " , " + p2; } var newString = "XXzzzz".replace(/(X*)(z*)/, replacer)
Как видите, тут две скобки в регулярном выражении, и потому в функции два параметра , .
Если бы были три скобки, то в функцию пришлось бы добавить параметр .
Следующая функция заменяет слова типа на :
function styleHyphenFormat(propertyName) { function upperToHyphenLower(match) { return '-' + match.toLowerCase(); } return propertyName.replace(//, upperToHyphenLower); }
Метасимволы
В приведенных выше примерах использовались простые шаблоны. Метасимволы позволяют выполнять более сложные сопоставления шаблонов PHP regexp, такие как проверка адреса электронной почты. Рассмотрим часто используемые метасимволы.
Метасимвол | Описание | Пример |
. | Обозначает любой единичный символ, кроме символа новой строки. | /./ — все, что содержит один символ. |
^ | Обозначает начало строки, не включая символ /. | /^PH/ — любая строка, которая начинается с PH. |
$ | Обозначает шаблон в конце строки. | /com$/ — guru99.com,yahoo.com и т.д. |
* | Обозначает любое количество символов, ноль или больше. | /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 regexp пример, в котором проверяется валидность адреса электронной почты:
<?php $my_email = "name @ company . com" if (preg_match("/^+@+.{2,5}$/", $my_email)) { echo "$my_email is a valid email address"; } else { echo "$my_email is NOT a valid email address"; } ?>
Результат: адрес электронной почты name@company.com является валидным.
Повторы¶
Повтор
За любым элементом регулярного выражения может следовать допустимое число повторений элемента.
RegEx | Находит |
---|---|
ровно раз | |
по крайней мере раз | |
по крайней мере , но не более чем раз | |
ноль или более, аналогично | |
один или несколько, похожие на | |
ноль или единица, похожая на |
То есть цифры в фигурных скобках определяются минимальное и максимальное количество повторов (совпадений во входном тексте).
эквивалентно и означает . совпадает или более раз.
Теоретически значение n и m не ограничены (можно использовать максимальное значение для 32-х битного числа).
RegEx | Находит |
---|---|
, и | |
, , но не | |
, и , но не | |
, , и т. д. | |
, или , но не | |
, или экземпляров ( это ) |
Жадность
в режиме захватывают как можно больше из входного текста, в режиме — как можно меньше.
По умолчанию все повторы являются . Используйте Чтобы сделать любой повтор .
Для строки :
RegEx | Находит |
---|---|
пустую строку | |
Вы можете переключить все повторы в режим (, ниже мы используем ).
RegEx | Находит |
---|---|
Операторы повторения
Иногда мы хотим указать, что какой-нибудь символ повторяется определенное число раз. Когда мы знаем это число точно, то просто пишем (‘#aaaa#’). Но как поступить, если мы желаем повторить один либо больше раз?
Вопрос решается с помощью операторов повторения (квантификаторов): плюс ‘+’ (один и больше раз), потом звездочка ‘*’ (ноль и больше раз), а затем вопрос ‘?’ (ноль либо один раз, то есть может быть, а может и не быть).
Эти операторы действуют на символ, который непосредственно стоит перед ними.
Для наилучшего понимания стоит рассмотреть пример:
В коде выше шаблон поиска выглядит следующим образом: буква ‘x’, потом ‘a’ один либо больше раз, потом ‘x’.
В этом случае шаблон поиска будет выглядеть следующим образом: буква ‘x’, буква ‘a’ ноль либо больше раз, буква ‘x’. То есть буквы ‘a’ либо нет, либо она повторяется один и больше раз.
Кроме самого очевидного варианта xax xaax xaaax, также подпадает подстрока ‘xx’, ведь там не существует буквы ‘a’ вообще (то есть ноль раз).
Также под шаблон не подпал и ‘xbx’. Это связано с тем, что отсутствует ‘a’, однако есть ‘b’ (ее не разрешали).
Здесь шаблон поиска выглядит следующим образом: буква ‘x’, далее ‘a’ может быть либо не быть, далее ‘x’.
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.
Экранируем спецсимволы
Иногда надо сделать так, чтобы спецсимвол обозначал себя сам. К примеру, чтобы найти по следующему шаблону: ‘a’, потом плюс ‘+’, потом ‘x’. Код ниже будет функционировать не совсем так, как хочется:
<?php echo preg_replace('#a+x#', '!', 'a+x ax aax aaax'); //выведет 'a+x ! ! !'' ?>
Тут разработчик планировал, чтобы шаблон поиска выглядел следующим образом: буква ‘a’, потом плюс ‘+’, потом ‘x’. На деле он выглядит иначе: буква ‘a’ один либо больше раз, потом ‘x’. Именно поэтому подстрока ‘a+x’ не подпала под шаблон (так как мешает ‘+’), а все остальные подпали.
Здесь важно запомнить следующее: чтобы спецсимвол обозначал себя сам, его надо экранировать посредством обратного слеша. Вот, каким образом это можно реализовать:
Теперь наш шаблон поиска выглядит нужным образом: буква ‘a’, потом плюс ‘+’, потом ‘x’.
В примере выше шаблон выглядит следующим образом: ‘a’, далее точка ‘.’, далее ‘x’. Сравним с примером ниже (тут забыт обратный слэш):
В результате все подстроки попали под шаблон, ведь неэкранированная точка обозначает, по сути, любой символ.
Следует обратить внимание вот на что: если забудете обратный слэш для точки (в случае, когда она должна сама себя обозначать), это можно даже и не заметить:
Да, визуально все работает правильно, но т. к. точка обозначает любой символ, включая обычную точку ‘.’. Однако если строку, где происходят замены, поменять, ошибка станет заметна:
Вывод прост: следует быть предельно внимательным!
Getting Started With Regular Expressions
For many beginners, regular expressions seem to be hard to learn and use. In fact, they’re far less hard than you may think. Before we dive deep inside regexp with useful and reusable codes, let’s quickly see the basics of PCRE regex patterns:
Regular Expressions Syntax
A regular expression (regex or regexp for short) is a special text string for describing a search pattern. A regex pattern matches a target string. The following table describes most common regex:
Regular Expression | Will match… |
---|---|
foo | The string “foo” |
^foo | “foo” at the start of a string |
foo$ | “foo” at the end of a string |
^foo$ | “foo” when it is alone on a string |
a, b, or c | |
Any lowercase letter | |
Any character that is not a uppercase letter | |
(gif|jpg) | Matches either “gif” or “jpg” |
+ | One or more lowercase letters |
Any number, dot, or minus sign | |
^{1,}$ | Any word of at least one letter, number or _ |
()() | wy, wz, xy, or xz |
Any symbol (not a number or a letter) | |
({3}|{4}) | Matches three letters or four numbers |
PHP Regular Expression Functions
PHP has many useful functions to work with regular expressions. Here is a quick cheat sheet of the main PHP regex functions. Remember that all of them are case sensitive.
For more information about the native functions for PHP regular expressions, have a look at the manual.
Function | Description |
---|---|
preg_match() | The function searches string for pattern, returning true if pattern exists, and false otherwise. |
preg_match_all() | The function matches all occurrences of pattern in string. Useful for search and replace. |
preg_replace() | The function operates just like , except that regular expressions can be used in the pattern and replacement input parameters. |
preg_split() | Preg Split () operates exactly like the function, except that regular expressions are accepted as input parameters. |
preg_grep() | The function searches all elements of , returning all elements matching the regex pattern within a string. |
preg_ quote() | Quote regular expression characters |
Бекслеши
Если ты смотрел другие учебники по регулярным выражениям, то наверно заметил,
что бекслеш везде пишут по-разному. Где-то пишут один бекслеш:
, а здесь в примерах он повторен 2 раза: .
Почему?
Язык регулярных выражений требует писать бекслеш один раз. Однако в
строках в одиночных и двойных кавычках в PHP бекслеш тоже имеет особое
значение: .
Ну например, если написать то PHP воспримет это как
специальную комбинацию и вставит в строку только символ
(и движок регулярных выражений не узнает о бекслеше перед ним). Чтобы
вставить в строку последовательность , мы должны удвоить бекслеш
и записать код в виде .
По этой причине в некоторых случаях (там, где последовательность символов
имеет специальный смысл в PHP) мы обязаны удваивать бекслеш:
- Чтобы написать в регулярке , мы пишем в коде
- Чтобы написать в регулярке , мы удваиваем каждый
бекслеш и пишем - Чтобы написать в регулярке бекслеш и цифру (),
бекслеш надо удвоить:
В остальных случаях один или два бекслеша дадут один и тот же
результат: и вставят в строку пару
символов — в первом случае 2 бекслеша это последовательность
для вставки бекслеша, во втором случае специальной последовательности
нет и символы вставятся как есть. Проверить, какие символы вставятся в строку,
и что увидит движок регулярных выражений, можно с помощью
echo: . Да, сложно, а что поделать?
Метасимволы
В регулярных выражениях используются два типа символов: обычные символы и метасимволы. Обычные символы — это те символы, которые имеют «буквальное» значение, а метасимволы — это те символы, которые имеют «особое» значение в регулярном выражении.
Преимуществом регулярных выражений является возможность использовать условия и повторения в шаблоне. Выражения записываются при помощи метасимволов, которые специальным образом интерпретируются. Метасимвол отличается от любого другого символа тем, что имеет специальное значение.
Одним из основных метасимволов является обратный слэш (\), который меняет тип символа, следующего за ним, на противоположный. Таким образом обычный символ можно превратить в метасимвол, а если это был метасимвол, то он теряет свое специальное значение и становится обычным символом. Этот приём нужен для того, чтобы вставлять в текст специальные символы как обычные. Например, символ в обычном режиме не имеет никаких специальных значений, но — это уже метасимвол, который обозначает: «любая цифра». Символ точка в обычном режиме значит — «любой единичный символ», а экранированная точка (\.) означает просто точку.
Метасимвол | Описание | пример |
---|---|---|
. | Соответствует любому одиночному символу, кроме новой строки. | /./ соответствует строке, состоящей из одного символа. |
^ | Соответствует началу строки. | /^cars/ соответствует любой строке, которая начинается с cars. |
$ | Соответствует шаблону в конце строки. | /com$/ соответствует строке, заканчивающейся на com, например gmail.com |
* | Соответствует 0 или более вхождений. | /com*/ соответствует commute, computer, compromise и т.д. |
+ | Соответствующий предыдущему символу появляется как минимум один раз. | Например, /z+oom/ соответствует zoom. |
\ | Используется для удаления метасимволов в регулярном выражении. | /google\.com/ будет рассматривать точку как буквальное значение, а не как метасимвол. |
a-z | Соответствует строчным буквам. | cars |
A-Z | Соответствует буквам в верхнем регистре. | CARS |
0-9 | Соответствует любому числу от 0 до 9. | /0-5/ соответствует 0, 1, 2, 3, 4, 5 |
Соответствует классу символов. | // соответствует pqr | |
| | Разделяет перечисление альтернативных вариантов. | /(cat|dog|fish)/ соответствует cat или dog или fish |
\d | Любая цифра. | /(\d)/ соответствует цифре |
\s | Найти пробельный символ (в т.ч. табуляция). | /(\s)/ соответствует пробелу |
\b | Граница слова (начало или конец). | /\bWORD/ найти совпадение в начале слова |
PHP regex quantifiers
A quantifier after a token or a group specifies how often that
preceding element is allowed to occur.
? - 0 or 1 match * - 0 or more + - 1 or more {n} - exactly n {n,} - n or more {,n} - n or less (??) {n,m} - range n to m
The above is a list of common quantifiers.
The question mark indicates there is zero or one of
the preceding element.
zeroorone.php
<?php $words = ; $pattern = "/colou?r/"; 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 have four nine in the array.
$pattern = "/colou?r/";
Color is used in American English, colour in British English.
This pattern matches both cases.
$ php zeroorone.php color matches the pattern colour matches the pattern comic does not match the pattern colourful matches the pattern colored matches the pattern cosmos does not match the pattern coloseum does not match the pattern coloured matches the pattern colourful matches the pattern
This is the output of the script.
The metacharacter matches the preceding element
zero or more times.
zeroormore.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 above script, we have added the metacharacter.
The combination means, zero, one or more single characters.
$ php zeroormore.php Seven matches the pattern even matches the pattern Maven does not match the pattern Amen does not match the pattern Leven matches the pattern
Now the pattern matches three words: Seven, even and Leven.
php> print_r(preg_grep("#o{2}#", )); Array ( => gool => root => foot )
The pattern matches strings that contain exactly
two ‘o’ characters.
php> print_r(preg_grep("#^\d{2,4}$#", )); Array ( => 12 => 123 => 1234 )
We have this pattern. The is a character
set; it stands for digits. The pattern matches numbers that have 2, 3, or 4 digits.
Escape-знаки
Обратная косая черта (\) в регулярных выражениях указывает, что следующий за ней символ либо является специальным знаком (как показано в следующей таблице), либо должен интерпретироваться буквально. Дополнительные сведения см. в разделе Escape-символы.
Escape-символ | Описание | Шаблон | Число соответствий |
---|---|---|---|
Соответствует знаку колокольчика, \u0007. | в | ||
В классе символов соответствует знаку BACKSPACE, \u0008. | в | ||
Соответствует знаку табуляции, \u0009. | , в | ||
Соответствует знаку возврата каретки, \u000D. ( не эквивалентен знаку начала новой строки, .) | в | ||
Соответствует знаку вертикальной табуляции, \u000B. | в | ||
Соответствует знаку перевода страницы, \u000C. | в | ||
Соответствует знаку новой строки, \u000A. | в | ||
Соответствует escape-знаку, \u001B. | в | ||
nnn | Использует восьмеричное представление для указания символа (nnn состоит из двух или трех цифр). | , в | |
nn | Использует шестнадцатеричное представление для указания символа (nn состоит ровно из двух цифр). | , в | |
Xx | Соответствует управляющему символу ASCII, который задан как X или x, где X или x является буквой управляющего символа. | в (Ctrl-C) | |
nnnn | Совпадение со знаком Юникода в шестнадцатеричном представлении (строго четыре цифры, представленные как nnnn). | , в | |
Если за этим знаком следует символ, не распознанный как escape-символ из этой и других таблиц данной темы, то соответствует в точности этому символу. Например, — это то же самое, что и , а — то же самое, что и . Это позволяет обработчику регулярных выражений распознавать языковые элементы (такие как *или ?) и символьные литералы (представленные как или ). | и в |