Регулярные выражения php if. Регулярные выражения PHP. Проверка телефонных номеров

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

Краткая история

  • Все началось в 1940 — 1960-х годах, когда множество умных людей говорили о регулярных выражениях;
  • 1970-е годы g / re / p;
  • 1980 Perl и Генри Спенсер;
  • 1997 PCRE (регулярные выражения, совместимые с Perl). Именно тогда начался взлет того, что мы называем регулярные выражения. PCRE предоставляет библиотеки почти для каждого языка.

Общее использование регулярных выражений в PHP

PHP включает в себя три основные функции для работы с PCRE — preg_match , preg_match_all и preg_replace .

Сравнение соответствия

Выражение возвращает 1 , если соответствие установлено, 0 — если нет, и false — если возникает ошибка:

int preg_match (string $pattern, string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]])

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

int preg_match_all (string $pattern, string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]])

Замена

Выражение возвращает замененную строку или массив (на основе объекта $subject ):

mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit = -1 [, int $count ]])

Общее использование регулярных выражений в JavaScript

Регулярные выражения в JavaScript выглядят почти так же, как и в PHP .

Сравнение соответствия

Возвращает массив совпадений или null , если совпадений не найдено:

string.match(RegExp);

Замена

Регулярное выражение, которое возвращает строку с выполненными заменами:

string.replace(RegExp, replacement);

Особенности регулярных выражений в JavaScript

  • Точка никогда не соответствует новой строке:
  • Те же методы для сравнения соответствия и замены через регулярное выражение, что и без них.

Принципы составления шаблонов регулярных выражений

Рассмотрим пример, в котором нужно найти адреса электронной почты в базе кода. Наша цель:

Аналоговые сокеты

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

  • специальные символы: ? * + {} () ^ $ / .
  • Литералы.

Представьте себе входные строки как болты, а шаблон — как набор разъемов для них (в соответствующем порядке).

Специальные символы

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

  • Символ обратной косой черты \ может заменять другой специальный символ в регулярном выражении:
  • Точка и w — .

Совпадение со всеми символами, кроме новых строк. Если хотите проверить на соответствие точке, и только точке — , на соответствие буквам, цифрам и нижнему подчеркиванию — w

  • Квадратные скобки .

Совпадение с символами внутри скобок. Поддерживает диапазоны. Некоторые примеры:
o — соответствует любым a, b или c.
o прописные буквы.
o любая цифра.
o — соответствует любому буквенному символу в нижнем или верхнем регистре.
Опционально? Соответствие 0 или 1.
Звездочка *.

Звездочка обозначает 0 или более символов.

Соответствие 1 или более символам.

Фигурные скобки {}.

Минимальное и максимальное значения. Некоторые примеры синтаксиса регулярных выражений:
o {1,} не менее 1.
o {1,3} от 1 до 3.
o {1,64} от 1 до 64.

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

/+@+(.+)*/i


Как это выглядит в PHP :

preg_match_all("/+@+(.+)*/i", $input_lines, $output_array);

Использование регулярного выражения для валидации

Задача : убедиться, что вводимые данные — это то, что мы ожидаем. Цель 1 : /[^w$.]/ Цель 2: /^{1,2}$/

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

Когда не стоит использовать регулярное выражение для проверки?

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

filter_var("[email protected]", FILTER_VALIDATE_EMAIL)

Валидация с помощью регулярных выражений

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

^ — указывает начало строки.
$ — знак доллара, который указывает конец строки.

if (!preg_match("%^{1,2}$%", $_POST["subscription_frequency"])) { $isError = true; }

Исключенные классы символов

[^abc] — все, кроме a , b или c , включая новые строки.

Пример, который обеспечивает ввод только буквенно-цифровых символов, тире, точки, подчеркивания:

if (preg_match("/[^0-9a-z-_.]/i", $productCode)) { $isError = true; }

Поиск и замена

Наиболее распространенными функциями PCRE для выполнения поиска и замены являются preg_replace() и preg_replace_callback() . Но есть также preg_filter() и preg_replace_callback_array() , которые делают почти то же самое. Обратите внимание, что функция preg_replace_callback_array() доступна, начиная с PHP7 .

Заменить слова в списке

$subject = "I want to eat some apples."; echo preg_replace("/apple|banana|orange/", "fruit", $subject);

Результат

I want to eat some fruits.

Если в регулярном выражении есть подшаблоны (в круглых скобках ), можно заменить $N или N (где N является целым числом > = 1 ), это называется «обратная ссылка».

Перестановка двух чисел

$subject = "7/11"; echo preg_replace("/(d+)/(d+)/", "$2/$1", $subject);

Результат

Изменение форматирования даты

$subject = "2001-09-11"; echo preg_replace("/(d+)-(d+)-(d+)/", "$3/$2/$1", $subject);

Результат

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

$subject = "Please visit https://php.earth/doc for more articles."; echo preg_replace("#(https?://([^s./]+(?:.[^s./]+)*[^s]*))#i", "$2", $subject);

Результат

Please visit php.earth/doc for more articles.

Иногда нужно выполнить сложный поиск и замену, например, при фильтрации/проверке перед заменой. В этой ситуации может пригодиться preg_replace_callback() .

Приведенное в предыдущем примере регулярное выражение может заменить только URL-адреса , начинающиеся с http или https . Но теперь нам также нужно заменить URL-адреса, начинающиеся с www. Кто-то подумает, что можно просто изменить https? : // в подшаблоне. Например, на (?: Https? : // | www . ), Но это не будет работать в большинстве браузеров, потому что они будут интерпретировать www.domain как относительный путь.

Поэтому в конструкторе регулярных выражений перед заменой нужно выполнить некоторые действия, добавив http:// , если URL-адрес начинается с www .

function add_protocol_if_begins_with_www($matches) { $url = strtolower($matches) === "www." ? "http://" . $matches : $matches; return "{$matches}"; } $subject = "Please visit www.php.earth/doc for more articles."; echo preg_replace_callback("#(https?://|www.)([^s./]+(?>.[^s./]+)*[^s]*)#i", "add_protocol_if_begins_with_www", $subject);

Результат

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

Существует несколько разных диалектов регулярных выражений, среди которых один из самых распространенных и развитых является синтаксис Perl -совместимых регулярных выражений (PCRE - Perl Compatible Regular Expressions ).

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

Задание границ регулярного выражения можно записать так:
"/комп/" Прямой слеш (/ ) вначале и конце набора символов служит границей регулярного выражения, то есть регулярное выражение будет действовать до тех пор, пока не встретится второй символ прямого слеша.

Допустимо использовать инструкции модификаторы шаблона, которые действующие на все регулярное выражение. Например, модификатор "i " будет осуществлять поиск по регулярному выражению без учета регистра. Для русских символов в кодировке UTF8 , для правильной обработки необходимо добавлять модификатор "u " (PCRE_UTF8 ). Например:
"/комп/ui" Регулярное выражение из примера будет соответствовать как строке "компьютер ", так и "КОМПЬЮТЕР ".

Для привязки регулярного выражения к началу слова используется символ "^ " (caret - знак вставки):
"/^свет/" Данное выражение будет соответствовать строке "светильник ", и не будет соответствовать слову "рассвет ".

Знак доллара "$ " означает конец строки:
"/^светильник$/" Данное регулярное выражение соответствует исключительно строке "светильник ", где после искомого слова нет другого текста.

Следующее регулярное выражение соответствует пустой строке:
"/^$/" Очень часто в поисковой строке содержится символ начала и конца регулярного выражение, в нашем случае символ косой черты "/ ". В этом случае необходимо экранировать данный символ с помощью символа обратного слеша (\ ):
"/^светильник\/потолочный$/" В данном примере регулярное выражение будет соответствовать строке светильник/потолочный ".

В качестве разделителя может выступать любой другой символ, например "| ":
"|^светильник\/потолочный$|ui" Изменять разделители необходимо выходя из задачи поиска, например, если символ косой черты "/ " встречается часто в поисковой строке, то его можно изменить.

Следует быть очень внимательными используя некоторые символы для разделителей, поскольку они могут выполнять свою роль в шаблоне. Использование символа вертикальной черты "| " в регулярном выражении может быть использовано для задания альтернативных масок:
"/^abc|def$/" Данному регулярному выражению соответствует любая строка, содержащая подстроки "abc " или "def ". Вертикальную черту в большинстве случаев применяют при проверке, например, расширений файлов или зон доменных имен.

Подстроки в регулярных выражениях можно группировать при помощи скобок "() ":
"/^цвет (красный|синий|зеленый)$/" Это регулярное выражение будет соответствовать строке вида "цвет красный ", но вместо "красный " может быть как "синий ", так и "зеленый ".

Для использования скобок как части искомой строки, их следует экранировать. Например, соответствовать строке "цвет (красный) " будет следующее регулярное выражение:
"/^цвет \(красный\)$/" Кроме группировки символов, скобки имеют еще одно предназначение. Все выражения, найденные в скобках, сохраняются интерпретатором, и к ним можно обратиться при замене или поиске по номеру скобки.

Чтобы задать класс символов необходимо использовать квадратные скобки "". Они ограничивают поиск теми символами, которые в них заключены:
"//" Данному регулярному выражению будет соответствовать подстрока, которая содержит хотя бы один символ из "abc ".

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

Аналогичным образом задаются регулярные выражения, соответствующие цифре:
"//" При использовании экранирования обратным слешем некоторые символы выполняют специальную интерпретацию:

\d - любая десятичная цифра ( );

\D - любой символ, кроме десятичной цифры;

\s - любой пробельный символ ([ \r\n\t\f] );

\S - любой непробельный символ;

\w - любой символ, образующий "слово" ( );

\W - любой символ, не образующий "слово";

\t - символ табуляции;

\n - символ перевода строки;

\\ - символ обратного слеша (\ );

\. - символ точки (. ).

Символ точки ". " обозначает любой символ в регулярном выражении кроме символов разрыва строки "\r " или "\n ", поэтому для поиска точки следует экранировать этот символ.

Регулярное выражение для числа можно записать следующим образом:
"/[\d]/" Чтобы исключить класс символов из поиска необходимо в квадратных скобках поставить первым символ "^ ", который действует уже не как указатель границы строки, а как отрицание:
"/[^0-9]/" Данное регулярное выражение отвечает любому символу, не содержащемуся в диапазоне "0-9 ".

Список специальных символов (метасимволы):
\^$.|()?*+{} Выражение в квадратных скобках часто применяется совместно с так называемыми квантификаторами , которые являют собой символы "? ", "+ " и "* ". Квантификаторы следуют сразу за символом и изменяют число вхождений конкретного символа в строку:

? - символ либо входит в строку один раз, либо вообще в нее не входит;

* - любое число вхождений символа в строку, в том числе и 0;

+ - одно или более число вхождений символа в строку.

Например, если необходимо найти подстроку, содержащую одну или более цифр, следует воспользоваться выражением вида:
"/[\d]+/" Символ "* " используется для любого числа вхождений строки в подстроку, то есть слудеющее регулярное выражение соответствует либо пустой строке, либо строке, содержащей неограниченное количество цифр.
"/^[\d]*$/" В регулярных выражениях так же применяются фигурные скобки ({} ), которые предназначены для указания числа или диапазона чисел повторения элемента:

"ab{2} " - соответствует строке "abb ";

"ab{2,} b " следует не менее двух "b ";

"ab{2,4} " - соответствует строке, в которой за "b " следует от 2 до 4 символов "b ".

Выражение "{0,} " полностью аналогично "* ", а "{1,} " - "+ ". Выражение "{0,1} " можно записать более коротко, используя "? ".

Для объединения символов в последовательность, их необходимо поместить в круглые скобки. Например, следующее регулярное выражение соответствует строке, в которой за "a " следует от 2 до 4 последовательностей "bc ";
"a(bc){2,4}/" Существует модификатор U , который инвертирует жадность. Например, выражение <.*> соответствует строке, содержащей несколько тегов HTML-разметки, целиком. Чтобы выделить отдельные теги, можно применить жадность: <.*?> или <.*>/U .

Жадность квантификаторов может оказаться значительной проблемой. Например, часто ожидают, что выражение <.*> найдет в тексте теги HTML. Однако если в тексте есть более одного HTML-тега, то этому выражению соответствует целиком строка, содержащая множество тегов.

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

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

Первой рассмотрим функцию Preg_match , которая осуществляет поиск в строке по регулярному выражению и имеет следующий синтаксис:
int preg_match(string $pattern, string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]]) Функция Preg_match ищет в заданном тексте Subject совпадения с шаблоном Pattern . Если задан необязательный параметр Matches , то результаты поиска помещаются в массив. Элемент $matches будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[i] - часть строки, соответствующей первым круглым скобкам, $matches - вторым и т. д.

Необязательный параметр Flags может принимать единственное значение PREG_OFFSET_CAPTURE , при указании которого изменяется формат возвращаемого массива $matches - каждое вхождение возвращается в виде массива, в нулевом элементе которого содержится найденная подстрока, а в первом - смещение. Поиск осуществляется слева направо, с начала строки.

Функция Preg_match возвращает количество найденных соответствий, которое может принимать только 2 значение - 0 (совпадения не найдены) и 1 , поскольку данная функция прекращает свою работу после первого найденного совпадения.

Для поиска всех совпадений, следует воспользоваться функцией Preg_match_all , которая имеет следующий синтаксис:
int preg_match_all(string $pattern, string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]]) Функция Preg_match_all ищет в строке Subject все совпадения с шаблоном Pattern и помещает результат в массив Matches в порядке, определяемом комбинацией флагов Flags . Так же как и в предыдущей функцией можно задать смещение Offset , начиная с которого будет осуществляться поиск встроке Subject . После нахождения первого соответствия последующие поиски будут осуществляться не с начала строки, а от конца последнего найденного вхождения.

Перейдем к функции, которая кроме поиска осуществляет и замену по регулярному выражению - Preg_replace :
mixed preg_replace(mixed $pattern, mixed $replacement, mixed $subject [, int $limit = -1 [, int &$count ]]) Функция Preg_replace выполняет поиск совпадений в строке Subject с шаблоном Pattern и заменяет их на Replacement .

Функция Preg_split разбивает строку по регулярному выражению.
array preg_split(string $pattern, string $subject [, int $limit = -1 [, int $flags = 0 ]]) Функция возвращает массив, состоящий из подстрок заданной строки Subject , которая разбита по границам, соответствующим шаблону Pattern .

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

Также существуют дополнительные конструкции шаблонов:

(?#комментарий) - комментарий в теле шаблона. Иногда очень полезно разместить в теле регулярного выражения конкретный комментарий для лучшего понимания работы.

(?:шаблон) - группировка как и "() ", но без обратной ссылки. Данная группировка очень полезна для задания шаблона но без создания обратной ссылки.

(?=шаблон) - "заглядывание" вперед. Данная конструкция может понадобится для поиска по шаблону с наперед указанным выражением, например, выражение "/\w+(?=\t)/ " соответствует слову, за которым идет символ табуляции, но символ "\t " не включается в результат.

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

Проверка правильности ввода E-mail :
preg_match("/^+@+\.{1,6}$/ui", $email) До символа собачки шаблон ищет буквы и цыфры, знак тире, нижнего подчеркивания и
крапки одно или более число вхождений начиная от начала строки:
^+ Далее следует вторая часть почтового адреса, начиная с собачки имея тот же набор символов, что и первая часть:
@+ После этого проверяем доменную зону, которая состоит исключительно из строки букв определенного количества символов до конца строки:
\.{1,6}$ Также с помощью регулярного выражения мы может выбрать все E-mail из текста:
$text = "Здесь текст и почтовый адрес [email protected] а также еще один адрес [email protected]";
preg_match_all("/+@+\.{1,6}/ui", $text, $matches, PREG_PATTERN_ORDER);
foreach ($matches as $key => $val) {
$email = filter_var($val, FILTER_VALIDATE_EMAIL);
if ($email) $output = $email;
} В отличии от проверка правильности ввода E-mail , при выборке мы убрали в шаблоне символ начала (^ ) и конца ($ ) строки. Результат данного примера:
Array
=> [email protected]
=> [email protected]
) Проверка правильности ввода имени:
preg_match("#^[а-яґїієa-z\-\_\".\d\s]+$#ui", $name); Проверка правильности ввода числа:
preg_match("/(+)/ui", $id) Корректность ввода даты:
$date = "2017.05.25";
preg_match("/^{4}.{2}.{2}$/ui", $date); Удалить все определения стилей Style :
preg_replace("/style=\"[^\"]*\"/", "", $string); Поскольку стили могут находится внутри практически любого тега, в примере удаляется исключительно само определение стиля без тега.

Удалить все определения строчных элементов документа Span :
preg_replace("#]*?>#is", "", $string);
preg_replace("#<\/span>#is", "", $table); Точно так же можно удалить любой тег, например, для заголовка H1 :
preg_replace("#]*?>#is", "", $table);
preg_replace("#<\/h1>#is", "", $table); Очистку таблиц с помощью регулярных выражений PHP можно осуществить так:
// Удаляем все из атрибутов Table:
$table = preg_replace("##siU", "

", $table);
// Удаляем все из атрибутов TR:
$table = preg_replace("##siU", "", $table);
// Удаляем все из атрибутов TD (кроме colspan или rowspan):
$table = preg_replace("#]+((colspan|rowspan)=[^\s>]+?)(|.*)>#siU", "
", $table); Проверить правильность имени файла можно с помощью следующего регулярного выражения:
preg_match("/(^+(*))$/", $filename) Вырезать все изображения в тексте:
preg_replace("//", "", $content) Найти все ссылки:
preg_match_all("#]*href="(.*)"[^>]*>#Ui", $content , $url); Представьте ситуацию, когда пользователь не использует символ пробела после точки или запятой. В данном случае получается весьма большое слово, которое не всегда может поместится в необходимое поле, что провоцирует горизонтальную прокрутку. Чтобы этого не случилось, можно воспользоваться следующим регулярным выражением, которое после точки или запятой будет добавлять символ пробела:
preg_replace("/(\.|\,)([^\s])/ui", "$1 $2", $content) Найти все хештеги (#tag ) можно так:
preg_match_all("/\#(\w+[^\s]*)/ui", $text, $matches, PREG_PATTERN_ORDER); Или вручную добавить необходимые символы и их количество, разрешенные для составление хештегов:
preg_match_all("/\#({1,50})/ui", $text, $matches, PREG_PATTERN_ORDER);

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

Основы регулярных выражений в PHP

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

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

Типы регулярных выражений

Существует 2 типа регулярных выражений:

  • Perl совместимый
  • POSIX расширенный

Perl совместимые функции – это такие как preg_match , preg_replace , а версии POSIX – такие как ereg , eregi . Учтите, что последние функции считаются устаревшими в PHP 5.3.0 и были удалены в . Поэтому мы будем использовать только Perl совместимые функции. Важно знать, что при использовании Perl-совместимых регулярных выражений, такое выражение должно быть заключено в разделители, например, косую черту (/).

Основной синтаксис регулярных выражений в PHP

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

  • Обычные символы, которые следуют один за другим, например, hello
  • Индикаторы начала и окончания строки в виде ^ и $
  • Индикаторы подсчета, такие как + , * , ?
  • Логические операторы, такие как |
  • Группирующие операторы, такие как {} , () ,

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

Код PHP для проверки электронной почты с использованием Perl-совместимого регулярного выражения выглядит следующим образом:

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

Регулярное выражение (шаблон) Проходит проверку (объект) Не проходит проверку (объект) Комментарий
world Hello world Hello Ivan Проходит, если шаблон присутствует где-либо в объекте
^world world class Hello world Проходит, если шаблон присутствует в начале объекта
world$ Hello world world class Проходит, если шаблон присутствует в конце объекта
world/i This WoRLd Hello Ivan Выполняет поиск в нечувствительном к регистру режиме
^world$ world Hello world Строка содержит только «world»
world* worl, world, worlddd wor Присутствует 0 или больше «d» после «worl»
world+ world, worlddd worl Присутствует по крайней мере одна «d» после «worl»
world? worl, world, worly wor, wory Присутствует 0 или 1 «d» после «worl»
world{1} world worly Присутствует одна «d» после «worl»
world{1,} world, worlddd worly Присутствует одна или больше «d» после «worl»
world{2,3} worldd, worlddd world Присутствует 2 или 3 «d» после «worl»
wo(rld)* wo, world, worldold wa Присутствует 0 или больше «rld» после «wo»
earth|world earth, world sun Строка содержит «earth» или «world»
w.rld world, wwrld wrld Содержит любой символ вместо точки
^.{5}$ world, earth sun Строка содержит ровно 5 символов
abc, bbaccc sun В строке есть «a», или «b» или «c»
world WORLD В строке есть любые строчные буквы
world, WORLD, Worl12 123 В строке есть любые строчные или прописные буквы
[^wW] earth w, W Фактический символ не может быть «w» или «W»

Теперь перейдем к более сложному регулярному выражению с подробным объяснением.

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

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

1) Проверка имени пользователя с помощью регулярного выражения
Начнем с проверки имени пользователя. Если у вас есть форма регистрации, вам понадобится проверять на правильность имена пользователей. Предположим, вы не хотите, чтобы в имени были какие-либо специальные символы, кроме « _.- » и, конечно, имя должно содержать буквы и возможно цифры. Кроме того, вам может понадобиться контролировать длину имени пользователя, например от 4 до 20 символов.

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

После этого нам нужно ограничить количество символов следующим кодом:

Теперь собираем это регулярное выражение вместе:

^{4,20}$

В случае Perl-совместимого регулярного выражения заключите его символами ‘ / ‘. Итоговый PHP-код выглядит так:

2) Проверка шестнадцатеричного кода цвета регулярным выражением
Шестнадцатеричный код цвета выглядит так: #5A332C , также допустимо использование краткой формы, например #C5F . В обоих случаях код цвета начинается с # и затем идут ровно 3 или 6 цифр или букв от a до f .

Итак, проверяем начало кода:

^#

Затем проверяем диапазон допустимых символов:

После этого проверяем допустимую длину кода (она может быть либо 3, либо 6). Полный код регулярного выражения выйдет следующим:

^#(({3}$)|({6}$))

Здесь мы используем логический оператор, чтобы сначала проверить код вида #123 , а затем код вида #123456 . Итоговый PHP-код проверки регулярным выражением выглядит так:

3) Проверка электронной почты клиента с использованием регулярного выражения
Теперь давайте посмотрим, как мы можем проверить адрес электронной почты с помощью регулярных выражений. Сначала внимательно рассмотрите следующие примеры адресов почты:

[email protected] [email protected] [email protected]

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

Таким образом, первая часть должна быть строкой с буквами, цифрами или некоторыми специальными символами, такими как _-. . В шаблоне мы можем написать это следующим образом:

^+

Доменное имя всегда имеет, скажем, имя и tld (top-level domain ) – т.е, доменную зону. Доменная зона – это.com , .ua , .info и тому подобное. Это означает, что шаблон регулярного выражения для домена будет выглядеть так:

+\.{2,5}$

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

^+@+\.{2,5}$

В коде PHP эта проверка будет выглядеть следующим образом:

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

В данной статье предоставлена подборка php regexp примеров. Очень хорошая и полезная коллекция примеров регулярных выражений (regular expressions). Все примеры регулярных выражений приемлемы для PHP. Пользуйтесь на здоровье!

Пример проверки доменного имени

Данный, php сниппет проверяет, является ли строка допустимым доменным именем.

?:.*)+):?(d+)?/?/i", $url)) { echo "Your url is ok."; } else { echo "Wrong url."; }

Пример подсветки слова в тексте

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

$text = "Sample sentence from KomunitasWeb, regex has become popular in web programming. Now we learn regex. According to wikipedia, Regular expressions (abbreviated as regex or regexp, with plural forms regexes, regexps, or regexen) are written in a formal language that can be interpreted by a regular expression processor"; $text = preg_replace("/b(regex)b/i", "1", $text); echo $text;

Пример реализации подсветки результатов поиска у WordPress

Откройте файл search.php и найдите функцию the_title(). Замените ее следующей строкой:

Echo $title;

А теперь, перед замененной строкой вставьте этот код:

\0", $title); ?>

Сохраните ваш файл search.php и откройте style.css. Добавьте в него следующую строку:

Strong.search-excerpt { background: yellow; }

Пример получения изображений из HTML методом regexp

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

$images = array(); preg_match_all("/(img|src)=("|")[^"">]+/i", $data, $media); unset($data); $data=preg_replace("/(img|src)("|"|="|=")(.*)/i","$3",$media); foreach($data as $url) { $info = pathinfo($url); if (isset($info["extension"])) { if (($info["extension"] == "jpg") || ($info["extension"] == "jpeg") || ($info["extension"] == "gif") || ($info["extension"] == "png")) array_push($images, $url); } }

Удаление повторяющихся слов (без учета регистра)

Часто встречаются слова, которые повторяются? Тогда пример этого регулярного выражения будет вам полезным.

$text = preg_replace("/s(w+s)1/i", "$1", $text);

Удаление повторяющихся точек

То же самое, только с повторяющимися точками.

$text = preg_replace("/.+/i", ".", $text);

Соответствие XML / HTML тегов

Эта простая функция принимает два аргумента: тег (соответствия которому вы хотите найти), xmlили html код.

Function get_tag($tag, $xml) { $tag = preg_quote($tag); preg_match_all("{<".$tag."[^>]*>(.*?)."}", $xml, $matches, PREG_PATTERN_ORDER); return $matches; }

Поиск XHTML/XML тегов с определенными значениями атрибутов

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

.

Function get_tag($attr, $value, $xml, $tag=null) { if(is_null($tag)) $tag = "\w+"; else $tag = preg_quote($tag); $attr = preg_quote($attr); $value = preg_quote($value); $tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*". "(["\"])$value\\2[^>]*>(.*?)<\/\\1>/" preg_match_all($tag_regex, $xml, $matches, PREG_PATTERN_ORDER); return $matches; }

Поиск шестнадцатеричных значений цвета

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

$string = "#555555"; if (preg_match("/^#(?:(?:{3}){1,2})$/i", $string)) { echo "example 6 successful."; }

Пример поиска title на заданной странице

Этот интересный пример PHP кода с regexp ищет и возвращает текст между тегами и .

Feof($fp)){ $page .= fgets($fp, 4096); } $titre = eregi("(.*)",$page,$regs); echo $regs; fclose($fp);

Парсинг лога Apache

Большинство сайтов работают на известных серверах Apache. Если ваш сайт также работает на нем, то можно сделать парсинг лога сервера с помощью php regexp.

//Logs: Apache web server //Successful hits to HTML files only. Useful for counting the number of page views. "^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)/[^ ?"]+?.html?)??((?#parameters)[^ ?"]+)? HTTP/+"s+(?#status code)200s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent)[^"]*)"$" //Logs: Apache web server //404 errors only "^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)[^ ?"]+)??((?#parameters)[^ ?"]+)? HTTP/+"s+(?#status code)404s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent)[^"]*)"$"

Пример проверки сложности пароля

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

"A(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)[-_a-zA-Z0-9]{6,}z"

Замена текстовых смайликов на графические смайлики

Данный пример кода будет менять текстовый смайлик, на ваш графический. Интересный и полезный php сниппет.

$texte="A text with a smiley:-)"; echo str_replace(":-)","",$texte);

Пример регулярного выражения для получения изображений из html кода

Стоит сказать, что данный php код используется в wordpress, для поиска и обработки изображений.

post_content; $szSearchPattern = "~]* />~"; // Run preg_match_all to grab all the images and save the results in $aPics preg_match_all($szSearchPattern, $szPostContent, $aPics); // Check to see if we have at least 1 image $iNumberOfPics = count($aPics); if ($iNumberOfPics > 0) { // Здесь вы можете обрабатывать ваши изображения // В данном примере они просто выведутся на монитор for ($i=0; $i < $iNumberOfPics ; $i++) { echo $aPics[$i]; }; }; endwhile; endif; ?>

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

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

Начнем с одной народной программистской мудрости:

Некоторые люди, сталкиваясь с проблемой, думают: «Ага, я умный, я решу её с помощью регулярных выражений». Теперь у них две проблемы.

Примеры шаблонов

Начнем с пары простых примеров. Первое выражение на картинке ниже ищет последовательность из 3 букв, где первая буква это «к», вторая - любая русская буква и третья - это «т» без учета регистра (например, «кот» или «КОТ» подходит под этот шаблон). Второе выражение ищет в тексте время в формате 12:34 .

Любое выражение начинается с символа-ограничителя (delimiter по англ.). В качестве него обычно используют символ / , но можно использовать и другие символы, не имеющие специального назначения в регулярках, например, ~ , # или @ . Альтернативные разделители используют, если в выражении может встречаться символ / . Затем идет сам шаблон строки, которую мы ищем, за ним второй ограничитель и в конце может идти одна или несколько букв-флагов. Они задают дополнительные опции при поиске текста. Вот примеры флагов:

  • i - говорит, что поиск должен вестись без учета регистра букв (по умолчанию регистр учитывается)
  • u - говорит, что выражение и текст, по которому идет поиск, исплоьзуют кодировку utf-8, а не только латинские буквы. Без него поиск русских (и любых других нелатинских) символов может работать некорректно, потому стоит ставить его всегда.

Сам шаблон состоит из обычных символов и специальных конструкций. Ну например, буква «к» в регулярках обозначает саму себя, а вот символы значат «в этом месте может быть любая цифра от 0 до 5». Вот полный список специальных символов (в мануале php их называют метасимволы), а все остальные символы в регулярке - обычные:

Ниже мы разберем значение каждого из этих символов (а также объясним почему буква «ё» вынесена отдельно в первом выражении), а пока попробуем применить наши регулярки к тексту и посмотреть, что выйдет. В php есть специальная функция preg_match($regexp, $text, $match) , которая принимает на вход регулярку, текст и пустой массив. Она проверяет, есть ли в тексте подстрока, соответствующая данному шаблону и возвращает 0 , если нет, или 1 , если она есть. А в переданный массив в элемент с индексом 0 кладется первое найденное совпадение с регуляркой. Напишем простую программу, применяющую регулярные выражения к разным строкам:

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

Скобки в регулярных выражениях

Давай повторим, что обозначают разные виды скобок:

  • Фигурные скобки a{1,5} задают число повторений предыдущего символа - в этом примере выражение ищет от 1 до 5 идущих подряд букв «a»
  • Квадратные скобки означают «один любой из этих символов», в данном случае - буквы a, b, c, x, y, z или цифра от 0 до 5. Внутри квадратных скобок не работают другие спецсимволы вроде | или * - они обозначают обычный символ. Если в квадратных скобках в начале стоит символ ^ то смысл меняется на противоположный: «любой один символ, кроме указанных» - например [^a-c] значит «один любой символ, кроме a, b или c».
  • Круглые скобки группируют символы и выражения. Например в выражении abc+ знак «плюс» относится только к букве c и это выражение ищет слова вроде abc, abcc, abccc. А если поставить скобки a(bc)+ то квантифиактор плюс относится уже к последовательности bc и выражение ищет слова abc, abcbc, abcbcbc

Примечание: в квадратных скобках можно указывать диапазоны символов, но помни, что русская буква ё идет отдельно от алфавита и чтобы написать «любая русская буква», надо писать [а-яё] .

Бекслеши

Если ты смотрел другие учебники по регулярным выражениям, то наверно заметил, что бекслеш везде пишут по-разному. Где-то пишут один бекслеш: \d , а здесь в примерах он повторен 2 раза: \\d . Почему?

Язык регулярных выражений требует писать бекслеш один раз. Однако в строках в одиночных и двойных кавычках в PHP бекслеш тоже имеет особое значение: мануал про строки . Ну например, если написать $x = "\$"; то PHP воспримет это как специальную комбинацию и вставит в строку только символ $ (и движок регулярных выражений не узнает о бекслеше перед ним). Чтобы вставить в строку последовательность \$ , мы должны удвоить бекслеш и записать код в виде $x = "\\$"; .

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

  • Чтобы написать в регулярке \$ , мы пишем в коде "\\$"
  • Чтобы написать в регулярке \\ , мы удваиваем каждый бекслеш и пишем "\\\\"
  • Чтобы написать в регулярке бекслеш и цифру (\1), бекслеш надо удвоить: "\\1"

В остальных случаях один или два бекслеша дадут один и тот же результат: "\\d" и "\d" вставят в строку пару символов \d - в первом случае 2 бекслеша это последовательность для вставки бекслеша, во втором случае специальной последовательности нет и символы вставятся как есть. Проверить, какие символы вставятся в строку, и что увидит движок регулярных выражений, можно с помощью echo: echo "\$"; . Да, сложно, а что поделать?

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

  • \d ищет одну любую цифру, \D - один любой символ, кроме цифры
  • \w соответствует одной любой букве (любого алфавита), цифре или знаку подчеркивания _ . \W соответствует любому символу, кроме буквы, цифры, знака подчеркивания.

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

Мануал

  • Синтаксис регулярных выражений в PHP , подробное описание
Программы и игры
school38vrn.ru - Операционные системы. Ноутбуки. Программы. Компьютер. Обзор технологий. Обслуживание