Регулярное выражение в php. что такое регулярные выражения?

Содержание:

Операторы для работы с регулярными выражениями в Javascript

exec(regexp) — находит все совпадения (вхождения в шаблон «регулярки») в строке. Возвращает массив (при совпадении) и обновляет свойство regexp-а, или null — если ничего не найдено,.
С модификатором g — при каждом вызове этой функции, она будет возвращать следующее совпадение после предыдущего найденного — это реализовано с помощью ведения индекса смещения последнего поиска.

match(regexp) — найти часть строки по шаблону. Если указан модификатор g, то функция match() возвращает массив всех совпадений или null (а не пустой массив). Без модификатора g эта функция работает как exec();

test(regexp) — функция проверяет строку на соответствие шаблону. Возвращает true — если есть совпадение, и false — если совпадения нет.

replace(regexp, mix) — метод возвращает строку изменную в соответствии с шаблоном (регуляррным выражением). Первый параметр regexp также может содержать строку, а не регулярное выражение. Без модификатора g — метод в строке заменяет только первое вхождение; с модификатором g — происходит глобальная замена, т.е. меняются все вхождения в данной строке. mix — шаблон замены, может принитать значения строки, шаблона замены, функции (имя функции).

Стоит подробнее остановиться на методе replace(), его второй параметр mix нужно описать более детально.

Если второй параметр mix содержит строку, то мы можем использовать следующие спецсимволы:

  • $$ — вставить $;
  • $& — совпавшая подстрока;
  • $` — часть строки перед совпавшей подстроки;
  • $’ — часть строки после совпавшей подстроки;
  • $n ($nn) — значение n-ой запоминающей скобки (если первый аргумент — объект RegExp);

Если второй параметр mix содержит функцию, то она будет вызванна при каждом совпадении. Значением для замены будет результат работы функции, т.е. return »;

Примеры таких функции:

Следующий вызов replace возвратит XXzzzz — XX , zzzz.

Как видите, тут две скобки в регулярном выражении, и потому в функции два параметра p1, p2.
Если бы были три скобки, то в функцию пришлось бы добавить параметр p3.

Следующая функция заменяет слова типа borderTop на border-top:

function styleHyphenFormat(propertyName)
{
  function upperToHyphenLower(match)
  {
    return '-' + match.toLowerCase();
  }
  return propertyName.replace(//, upperToHyphenLower);
}

Таким блоком кода я разбираю javascript вхождения в html:

Класс RegExp

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

RegExp(Регулярное выражение, Флаги)

Он принимает только один обязательный пареметр — это «Регулярное выражение», которое заключается в кавычки.
Параметр «флаги» представляет собой дополнительные условия поиска и может принимать значения:

  • g — задается глобальный поиск, если этот флаг установлен, то выражение возвратит все подходящие слова.
  • i — игнорирование регистра символов
  • m — многострочный поиск

Для работы с регулярными варажениями используются три метода класса String:

  • match — выполняет поиск в строке, используя регулярное выражение, переданное в качестве параметра
    и возвращает массив с результатами поиска. Если ничего не найдено, возвращается null.
  • replace — выполняет поиск и замену в строке, используя регулярные выражения, и возвращает полученную строку.
  • search — выполняет поик в строке, используя регулярное выражение, переданное в качестве параметра,
    и возвращает позицию первой подстроки, совпадающей с регулярным выражением.

Свойства

Свойство Описание
lastIndex Задает позицию начала поиска в строке
sourse Возвращает строку регулярного выражения (только чтение)
global Определяет наличие флага g и возвращает соответсявенно true или false
ignoreCase Определяет наличие флага i и возвращает соответсявенно true или false
multilane Определяет наличие флага m и возвращает соответсявенно true или false

Методы

Метод Описание
compile (Регулярное выражение g,i,m) Компилирует регулярное выражение во внутренний формат для ускорения работы, может использоваться для изменения регулярного выражения
exec(строка) Аналогичен методу match класса String, но строка, где нужно произвести поиск, передается в качестве параметра
test(строка) Аналогичен методу search класса String, возвращает true или false в зависимости о результатов поиска

Пример

Здесь этот участок скрипта производит поиск текста «www» в строке, которая была присвоена переменной «str» без учета регистра,
а метод match возвращает массив result, содержащий результаты поиска.

Метасимволы

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

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

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

Метасимвол Описание пример
. Соответствует любому одиночному символу, кроме новой строки. /./ соответствует строке, состоящей из одного символа.
^ Соответствует началу строки. /^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/ найти совпадение в начале слова

Скобочные группы ― ()

a(bc)       создаём группу со значением bc -> тестa(?:bc)*    оперетор ?: отключает группу -> тестa(?<foo>bc) так, мы можем присвоить имя группе -> тест

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

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

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.

Модификаторы регулярных выражений

Модификаторы указываются либо в скобках, например так: (?Ui), либо после закрывающего символа ‘/pattern/Ui’.

Модификатор Описание
i Выполняет поиск без учета регистра. Например «/a/i» ищет и a, и A.
m Выполняет многострочный поиск (шаблоны, которые ищут начало или конец строки, будут соответствовать началу или концу каждой строки)
u Обеспечивает правильное сопоставление шаблонов в кодировке UTF-8 (для поиска русского текста например).
U Инвертирует «жадность» (по умолчанию жадный, т.е. пытается захватить как можно большую строку, подходящую по условию).
s Если используется, то символ точка (.) соответствует и переводу строки. Иначе она ему не соответствует.
x Игнорировать пробелы. В этом случае пробелы нужно экранировать обратным слэшем \.

При использовании модификаторов, можно использовать знак минус для отключения модификатора. Например: (?m-i) — включаем многострочный поиск и отключаем регистронезависимый.

Функции для работы с регулярными выражениями

В PHP есть поддержка 2 типов записи РВ — POSIX и Perl. POSIX (Portable Operating System Interface) представляет собой интерфейс переносной операционной системы и стандарт для интерфейсов приложений. Сейчас мы рассмотрим РВ POSIX и Perl-совместимые РВ.

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

ereg()

bool ereg(string pattern, string string )

Эта функция осуществляет поиск соответствия РВ в строке string, который задан в шаблоне pattern. В случае наличия соответствий шаблона с подвыражениями их сохранят в массиве соответствий regs. В $regs имеется копия строки string, а в $regs находится подстрока, которая начинается с первой левой скобки. Подстрока со второй левой скобки хранится в $regs и т. д.

Рассмотрим код, который из формата YYYY-MM-DD преобразовывает формат даты в  DD.MM.YYYY.

<? $date = "2015-03-21";
if (ereg ("({4})-({1,2})-({1,2})", $date, $regs)){
        echo "$regs.$regs.$regs";
    }
    else{
        echo "Неверный формат даты: $date";
    }
?>

ereg_replace()

string ereg_replace(string pattern, string replacement, string string)

Данная функция меняет шаблон pattern, который был обнаружен в строке string, на строку replacement. При наличии соответствия происходит осуществление модифицированной строки.

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

<? 
$number = "1952";
$str = "Он родился в пятьдесят втором.";
echo("до замены:$str");
$str = ereg_replace("пятьдесят втором", $number, $str);
echo("<br> после замены: $str");
?>

Результат:

до замены: Он родился в пятьдесят втором.после замены: Он родился в 1952.

eregi()

bool eregi (string pattern, string string)

Данная функция аналогична ereg. Отличие состоит в том, что регистр игнорируется.

eregi_replace()

string eregi_replace (string pattern, string replacement, string string)

Отличие данной функции от ereg_replace состоит в том, что она не является чувствительной к регистру.

split()

array split (string pattern, string string )

Данная функция проводит возвращение массива строк из подстрок строк string, которые были образованы в соответствии с РВ pattern в ходе разделения строки string на подстроки. При указании параметра limit (он не является обязательным) возвращаемый массив будет иметь до limit элементов, причем в последнем имеется неразделенная часть строки.

Данная функция окажет пользу при разделении доменных имен, дат и проч. Например:

<? 
$url = "www.softtime.ru";
$array = split ("\.", $url); 
foreach($array as $index => $val) {
    echo("$index -> $val <br />");  
}?>

В результате будет следующее:

0 -> www 1 -> softtime 2 -> ru

Это же можно осуществить и с датой:

<?
$date = "10-12-2003"
$array = split ("-", $date);
foreach($array as $index => $val){
    echo("$index -> $val <br />");
}
?>

В результате мы получим:

0 -> 10 1 -> 12 2 -> 2015

spliti()

array spliti (string pattern, string string )

Практические примеры сложных регулярных выражений

Теперь, когда вы знаете теорию и основной синтаксис регулярных выражений в 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 скриптах.

  • 3563

  • 35

  • Опубликовано 16/04/2019

  • PHP, Уроки программирования

Регулярные выражения в разных языках программирования

Здесь я приведу примеры использования регулярных выражений в различных языках программирования

Заранее говорю, я не буду заострять внимание на синтаксисе языка программирования, так как это уже не касается данной темы. C#

C#

Здесь мы создаем строку с текстом, который хотим проверить, создаем объект класса Regex и в конструктор пишем нашу регулярку (как я и говорил, я не буду заострять внимание на том, что такое объект класса и конструктор). Потом создаем объект класса MatchCollection и от объекта regex вызываем метод Matches и в параметры передаем нашу строку

В результате все сопоставления будут добавляться в коллекцию matches.

Java

Здесь похожая ситуация. Создаем объект класса Pattern и записываем нашу строку. CASE_INSENSITIVE означает, что он не привязан к регистру (то есть нет разницы между заглавными и строчными символами). Создаем объект класса Matcher и пишем туда регулярку.

JavaScript

Здесь тоже все просто. Вы создаете объект regex и пишете туда регулярку. И затем просто создаете объект matches, который будет являться коллекцией и вызываете метод exec и в параметры передаете строку.

Экранируем спецсимволы

Иногда надо сделать так, чтобы спецсимвол обозначал себя сам. К примеру, чтобы найти по следующему шаблону: ‘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’. Сравним с примером ниже (тут забыт обратный слэш):

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

Следует обратить внимание вот на что: если забудете обратный слэш для точки (в случае, когда она должна сама себя обозначать), это можно даже и не заметить:

Да, визуально все работает правильно, но т. к. точка обозначает любой символ, включая обычную точку ‘.’. Однако если строку, где происходят замены, поменять, ошибка станет заметна:

Вывод прост: следует быть предельно внимательным!

Глобальный объект RegExp

Этот глобальный объект служит для боступа к результатам поиска с использованием регулярных выражений.
Этот объект создается самим интерпритатором и доступен всегда. Формат доступа к его свойствам:

RegExp.свойство

Свойства

Свойство Описание
$номер подвыражения Возвращает одно из последних найденых подвыражений (зависит от номера).
Номер может быть 1-9, т.к.интерпретатор хранит в этом свойстве только девять последних найденых подвыражений,
для доступа к остальным используется массив, возвращенный методами match или exec
index Возвращает позицию в строке найденой подстроки
input|&_ Возвращает строку, где производится поиск
lastIndex Задает позицию начала поиска в строке
lastMatch|$& Возвращает последнюю найденую подстроку
lastParent|$+ Возвращает последнюю найденую группу символов, если в регулярном выражении использовались подвыражения
leftContext|$’ Возвращает строку, составленую из всех символов от начала строки до последней найденой подстроки, не включая ее
rightContext|$’ Возвращает строку, составленую из всех символов от последней найденой подстроки, не включая ее, до конца исходной строки

Ленивая и жадная квантификация

Жадность — это стремление интерпретатора захватить максимально длинную строку, которая соответствует шаблону. Например, у нас есть строка:

Если мы хотим получить выражение в первых скобках, то попробуем задать вот такую маску: /\(.*\)/. Результат будет таким:

Обуздать жадность интерпретатора можно двумя способами:
1. В маске запретить двигаться дальше одной закрывающей скобки — /\(*\)/.
2. Воспользоваться ленивым квантификатором, добавив знак вопроса после звездочки — /\(.*?\)/.

После чего результат будет таким как мы и хотели:

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

Жадный Ленивый
* *?
+ +?
{n,} {n,}?

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

Разбор URL

Данный скрипт разбивает интернет адрес на несколько составных частей. В регелярном выражении использовалось
несколько подвыражений, которые сохраняются интерпритатором следующим образом: сначала сохраняется внешнее
выражение, а затем внутренее. После регулярного выражения следует строка (result=re.exec(str);), которая
начинает разбивание адреса, а далее проверяется правильность адреса и, в случае положительного результата,
происходит присваивание переменным соответствующих частей адреса.

Использование g для глобального последовательного поиска

В браузере мы увидим такой результат:

Кош — начинается с 0-го символа
Дальше поиск начнется с 3-го символа

кор — начинается с 8-го символа
Дальше поиск начнется с 11-го символа

кот — начинается с 22-го символа
Дальше поиск начнется с 25-го символа

Маску поиска и её параметры можно также указывать через конструктор объекта RegExp:

Разбиваем числа на троичные (тысячные) группы:

$1 — эта переменная содержит значение первого соответствия (первые «запоминающие» скобки в регулярном выражении)

Еще про регулярные выражения:

  • Регулярные выражения в PHP
  • примеры регулярных выражений
  • regexr.com — Сервис проверки регулярных выражений
  • pagecolumn.com — Сервис проверки регулярных выражений
  • uiregex.com — создание регулярных выражений

Условная компиляция в JavaScript

Поиск в тексте российских мобильных номеров телефонов

Уверенно парсит номера вот такого вида:
8 910 82 570 26
+79261234567
89261234567
79261234567
+7 926 123 45 67
8(926)123-45-67
8 (926)123-45-67
8-(926)123-45-67
9261234567
79261234567
89261234567
8-926-123-45-67
8 927 1234 234
8 927 12 12 888
8 927 12 555 12
8 927 123 8 123

preg_match_all('/(8|7|\+7){0,1}{0,}({2}){0,}(({2}{0,}'.
	'{2}{0,}{3})|({3}{0,}{2}{0,}{2})|({3}{0,}'
	'{1}{0,}{3})|({2}{0,}{3}{0,}{2}))/',
	$text, $regs );

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

По всем странам:

/^\+?((?!95|99|907|94|336|986)(\d|9|7)\d{8}|
    \d{9,13}|68\d{7}|5\d{8,12}|55\d{9}|5519\d{8}|500\d{4}|
    5016\d{6}|5068\d{7}|502\d{7}|5037\d{7}|50\d{8}|50855\d{4}|509\d{7}|
    376\d{6}|855\d{8}|856\d{10}|85\d{8,10}|8\d{10,11}|8\d{10}|82\d{9,10}|
    852\d{8}|90\d{10}|96(0|17|13)\d{6}|96\d{9}|964\d{10}|96(5|89)\d{7}|
    96(65|77)\d{8}|92\d{9}|91\d{9}|97\d{8}|959\d{7}|989\d{9}|97\d{8,12}|
    99\d{7,11}|994\d{9}|9955\d{8}|996\d{8}|9989\d{8}|380\d{8}|381\d{9}|
    385\d{8,9}|375\d{8}|372\d{7,8}|37\d{8}|37\d{7,11}|30\d{9}|34\d{8}|
    3\d{8,12}|36\d{9}|38\d{8}|382\d{8,9}|46719\d{10})$/

По СНГ:

/^((\+?7|8)(?!95|99|907|94|336|986)(\d|9|7)\d{8}|
    \+?(99\d{7,11}|994\d{9}|9955\d{8}|996\d{8}|9989\d{8}|380\d{8}|
    375\d{8}|372\d{7,8}|37\d{8}))$/

Россия:

/^\+?(79|73|74|78)/

Украина:

/^\+?380/

Казахстан:

/^\+?(7701|7702|7775|7778)/
/^\+?(7777|7705|7771|7776)/
/^\+?(7707|7747)/
/^\+?(7700|7717|7727|7725|7721|7718|7713|7712)/

СНГ:

/^\+?(7940|374|375|995|996|370|992|993|998)/

Функции регулярных выражений

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

Функция Определение
preg_match() Эта функция ищет конкретный образец в некоторой строке. Он возвращает 1 (true), если шаблон существует, и 0 (false) в противном случае.
preg_match_all() Эта функция ищет все вхождения шаблона в строке. Она возвращает количество найденных совпадений с шаблоном в строке, или 0 — если вхождений нет. Функция удобна для поиска и замены.
ereg_replace() Эта функция ищет определенный шаблон строки и возвращает новую строку, в которой совпадающие шаблоны были заменены другой строкой.
eregi_replace() Функция ведет себя как ereg_replace() при условии, что поиск шаблона не чувствителен к регистру.
preg_replace() Эта функция ведет себя как функция ereg_replace() при условии, что регулярные выражения могут использоваться как в шаблоне так и в строках замены.
preg_split() Функция ведет себя как функция PHP split(). Он разбивает строку на регулярные выражения в качестве параметров.
preg_grep() Эта функция ищет все элементы, которые соответствуют шаблону регулярного выражения, и возвращает выходной массив.
preg_quote() Эта функция принимает строку и кавычки перед каждым символом, который соответствует регулярному выражению.
ereg() Эта функция ищет строку, заданную шаблоном, и возвращает TRUE, если она найдена, иначе возвращает FALSE.
eregi() Эта функция ведет себя как функция ereg() при условии, что поиск не чувствителен к регистру.

Примечание:

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

Функция preg_match()

Функция выполняет проверку на соответствие регулярному выражению.

Пример. Поиск подстроки «php» в строке без учета регистра:

Попробуй сам

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

Вхождение найдено.

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

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

Функция preg_match_all()

Функция выполняет глобальный поиск шаблона в строке.

В примере регулярное выражение используется для подсчета числа вхождений «ain» в строку без учета регистра:

Попробуй сам

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

3

Функция preg_replace()

Функция выполняет поиск и замену по регулярному выражению.

В следующем функция выполняет поиск в строке совпадений с шаблоном pattern и заменяет их на replacement:

Буквы, цифры, символы

В регулярных выражениях существуют два вида символов: обозначающие сами себя и символы, которые называют командами (спецсимволы).

Цифры и буквы обозначают сами себя, зато точка — спецсимвол, обозначающий «любой символ». Смотрим примеры:

По сути, в коде выше не существует разницы между функциями 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.

Основы основ

Для начала нужно понять что в Regex есть специальные символы (например символ начала строки — ), если вы хотите просто найти данный символ, то нужно ввести обратный слеш перед символом для того, чтобы символ не работал как команда.

Для того чтобы найти текст, нужно собственно просто ввести этот текст:

Якори

— символ который обозначает начало строки

— символ который обозначает конец строки

Найдем строки которые начинаются с The Beginning:

Найдем строки, которые заканчиваются на The End:

Найдем строки, которые начинаются и заканчиваются на The Beginning and The End:

Найдем пустые строки:

Квантификаторы

— символ, который указывает на то, что выражение до него должно встретиться 0 или 1 раз

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

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

— скобки с одним аргументом указывают сколько раз выражение до них должно встретиться

— скобки с двумя аргументами указывают на то, от скольки до скольки раз выражение до них должно встретиться

— скобки объединяют какое-то предложение в выражение. Обычно используется в связке с квантификаторами

Давайте попробуем найти текст, в котором будут искаться все слова, содержащие ext или ex:

Давайте попробуем найти текст, в котором слова будут содержать ext или e:

Найти все размеры одежды (XL, XXL, XXXL):

Найти все слова, у которых есть неограниченное число символов c, после которых идёт haracter:

Найти выражение, в котором слово word повторяется от одного до неограниченного количества раз:

Найти выражение, в котором выражение ch повторяется от 3 до неограниченного количества раз:

Выражение «или»

— символ, который обозначает оператор «или»

— выражение в квадратных скобках ставит или между каждым подвыражением

Найти все слова, в которых есть буквы a,e,c,h,p:

Найти все выражения в которых есть ch или pa:

Escape-последовательности

— отмечает один символ, который является цифрой (digit)\

— отмечает символ, который не является цифрой

— отмечает любой символ (число или букву (или подчёркивание)) (word)

— отмечает любой пробельный символ (space character)

— отмечает любой символ (один)

Выражения в квадратных скобках

Кроме того, что квадратные скобки служат оператором «или» между каждым символом, который в них заключён, они также могут служить и для некоторых перечислений:

— один символ от 0 до 9

— любой символ от a до z

— любой символ от A до Z

— любой символ кроме a — z

Найти все выражения, в которых есть английские буквы в нижнем регистре или цифры:

Флаги

Флаги — символы (набор символов), которые отвечают за то, каким именно образом будет происходить поиск.

Форма условия поиска в Regex выглядит вот так:

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

— флаг, который заставляет искать выражения вне зависимости от региста (case insensitive)

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

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

Повторения символов или комбинаций описываются с помощью квантификаторов (метасимволов, которые задают количественные отношения). Есть два типа квантификаторов: общие (задаются с помощью фигурных скобок ) и сокращенные (сокращения наиболее распространенных квантификаторов). Фигурные скобки задают число повторений предыдущего символа (в этом случае выражение ищет от 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 subpatterns

We can use square brackets to create subpatterns
inside patterns.

php> echo preg_match("/book(worm)?$/", "bookworm");
1
php> echo preg_match("/book(worm)?$/", "book");
1
php> echo preg_match("/book(worm)?$/", "worm");
0

We have the following regex pattern: . The is
a subpattern. The ? character follows the subpattern, which means that the subpattern
might appear 0, 1 times in the final pattern. The character is here for
the exact end match of the string. Without it, words like bookstore, bookmania would match too.

php> echo preg_match("/book(shelf|worm)?$/", "book");
1
php> echo preg_match("/book(shelf|worm)?$/", "bookshelf");
1
php> echo preg_match("/book(shelf|worm)?$/", "bookworm");
1
php> echo preg_match("/book(shelf|worm)?$/", "bookstore");
0

Subpatterns are often used with alternation. The
subpattern enables to create several word combinations.

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

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