php регулярное выражение или
Регулярные выражения PHP
Что такое регулярные выражения PHP?
Для чего используются регулярные выражения:
Регулярные выражения PHP
Теперь рассмотрим практические примеры использования упомянутых выше функций.
Preg match PHP
В приведенном ниже коде показан вариант реализации данного примера:
Preg split PHP
Мы возьмем фразу и разобьем ее на массив; шаблон предназначен для поиска единичного пробела:
Preg replace PHP
Метасимволы
Метасимвол | Описание | Пример |
. | Обозначает любой единичный символ, кроме символа новой строки. | /./ — все, что содержит один символ. |
^ | Обозначает начало строки, не включая символ /. | /^PH/ — любая строка, которая начинается с PH. |
$ | Обозначает шаблон в конце строки. | /com$/ — guru99.com,yahoo.com и т.д. |
* | Обозначает любое количество символов, ноль или больше. | /com*/ — computer, communication и т.д. |
+ | Требуется вхождение перед метасимволом символа (ов) хотя бы один раз. | /yah+oo/ — yahoo. |
Символ экранирования. | /yahoo+.com/ — воспринимает точку, как дословное значение. | |
[…] | Класс символов. | /[abc]/ — 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 пример, в котором проверяется валидность адреса электронной почты:
Результат: адрес электронной почты name@company.com является валидным.
Пояснение шаблона «[/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+.[a-zA-Z.]<2,5>$/] «
Метасимволы являются полезными, когда речь идет о сопоставлении на соответствие шаблонам.
Заключение
Пожалуйста, оставьте ваши комментарии по текущей теме статьи. Мы очень благодарим вас за ваши комментарии, отклики, лайки, дизлайки, подписки!
Php регулярное выражение или
Для чего используются регулярные выражения:
Регулярные выражения в PHP
PHP содержит встроенные функции, которые позволяют работать с регулярными выражениями. Теперь рассмотрим часто используемые функции регулярных выражений PHP.
Ниже приведен синтаксис функций регулярных выражений, таких как preg_match, preg_split или PHP regexp replace:
«имя_функции» — это либо preg_match, либо preg_split, либо preg_replace.
«/…/» — косые черты обозначают начало и конец регулярного выражения.
«’/шаблон/’» — шаблон, который нам нужно сопоставить.
«объект» — строка, с которой нужно сопоставлять шаблон.
Теперь рассмотрим практические примеры использования упомянутых выше функций.
Preg_match
В первом примере функция preg_match используется для выполнения простого сопоставления шаблоном для слова guru в заданном URL-адресе.
В приведенном ниже коде показан вариант реализации данного примера:
«preg_match(…)» — функция PHP match regexp.
«’/Guru/’» — шаблон регулярного выражения.
«$My_url» — переменная, содержащая текст, с которым нужно сопоставить шаблон.
Preg_split
Рассмотрим другой пример, в котором используется функция preg_split.
Мы возьмем фразу и разобьем ее на массив; шаблон предназначен для поиска единичного пробела:
Preg_replace
Рассмотрим функцию preg_replace, которая выполняет сопоставление с шаблоном и заменяет найденный результат другой строкой.
Приведенный ниже код ищет в строке слово guru. Он заменяет его кодом css, который задает цвет фона:
Метасимволы
В приведенных выше примерах использовались простые шаблоны. Метасимволы позволяют выполнять более сложные сопоставления шаблонов PHP regexp, такие как проверка адреса электронной почты. Рассмотрим часто используемые метасимволы.
Метасимвол | Описание | Пример |
. | Обозначает любой единичный символ, кроме символа новой строки. | /./ — все, что содержит один символ. |
^ | Обозначает начало строки, не включая символ /. | /^PH/ — любая строка, которая начинается с PH. |
$ | Обозначает шаблон в конце строки. | /com$/ — guru99.com,yahoo.com и т.д. |
* | Обозначает любое количество символов, ноль или больше. | /com*/ — computer, communication и т.д. |
+ | Требуется вхождение перед метасимволом символа (ов) хотя бы один раз. | /yah+oo/ — yahoo. |
Символ экранирования. | /yahoo+.com/ — воспринимает точку, как дословное значение. | |
[…] | Класс символов. | /[abc]/ — 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 пример, в котором проверяется валидность адреса электронной почты:
Результат: адрес электронной почты name@company.com является валидным.
Пояснение шаблона «[/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+.[a-zA-Z.]<2,5>$/] «
«’/…/’» начинает и завершает регулярное выражение.
«^[a-zA-Z0-9._-]» соответствует любым буквам в нижнем или верхнем регистре, цифрам от 0 до 9 и точкам, подчеркиваниям или тире.
«+@[a-zA-Z0-9-]» соответствует символу @, за которым следуют буквы в нижнем или верхнем регистре, цифры от 0 до 9 или дефисы.
«+.[a-zA-Z.]<2,5>$/» указывает точку, используя обратную косую черту, затем должны следовать любые буквы в нижнем или верхнем регистре, количество символов в конце строки должно быть от 2 до 5.
Метасимволы являются полезными, когда речь идет о сопоставлении на соответствие шаблонам.
Регулярные выражения в PHP
Чтобы найти в строке какое-то совпадение, достаточно просто записать это совпадение внутри двух слэшей.
Её использование выглядит следующим образом:
Давайте приведём пример. Найдём, слово «век» в строке «человек».
Для того, чтобы быстрее составлять регулярки, есть онлайн-сервисы. Они позволяют не переписывать шаблон и запускать каждый раз код, а делать всё это прямо в браузере. Я неоднократно пользовался сервисом https://regex101.com/ и вам его рекомендую.
Я ввёл в шаблон «/ку/» и строку «кукушка». В результате получил 2 совпадения.
Помимо этого у сервиса есть вкладка «Code generator», на которой вы сразу сможете получить готовый код на PHP для своего примера:
Символы
Давайте теперь перейдём к более интересным примерам.
Давайте найдём такие совпадения для строки «кукушки не кушают шоколадки». Паттерн примет следующий вид: «/к./». То есть буква «к» и любой символ.
Видим, что нашлось немало совпадений. Давайте добавим теперь после точки ещё одну букву «ш».
Теперь совпадения только два.
Нужно найти несколько подряд идущих точек? Да не вопрос! Заэкранируйте их все:
Квантификаторы
Если что-то должно повториться точное число раз, например, 3, то пишется просто <3>.
Есть также квантификаторы, которые используются чаще других и для них сделаны специальные символы:
Немного примеров:
Символ точки, повторяющийся от одного и более раз
Восклицательный знак, перед которым либо есть вопросительный знак, либо нет
Модификаторы
Глобальный поиск
А не обратили ли вы внимание на букву g после закрывающего слеша в паттерне?
Видите? Теперь только одно совпадение осталось.
Жадность
Есть ещё один довольно популярный модификатор, который позволяет сделать поиск либо жадным, либо нежадным. Жадный поиск захватывает максимально возможную подстроку. Давайте рассмотрим вот такой пример:
Видите, какую строку захватило? А если бы нам хотелось остановиться на первой букве «к»? Тогда нам просто нужно было бы сделать поиск нежадным. Для этого используется модификатор «U»
В PHP он при этом указывается после закрывающего слеша паттерна:
Вообще, все остальные модификаторы как и «U» указываются после слеша, это только для модификатора g пришлось сделать две разные функции.
Итак, давайте сформулируем основные тезисы по жадности и нежадности:
Классы символов
Очень часто в регулярках возникает потребность в перечислении символов, которые подходят под условия. Например, нужно найти символ двоеточия, после которого идут три цифры. Для таких случаев используют классы символов. Это символы, помещённые в квадратные скобки. Примеры таких классов:
Когда вы используете такой класс в шаблоне, это соответствует одному из символов из этого шаблона. Не нескольким, а одному из них! Чтобы было несколько, нужно использовать квантификаторы.
Пример: двоеточие, после которого идут три цифры от 0 до 3
Если нужно сделать отрицание, то внутри таких кавычек перед остальными ставится символ «^».
Давайте теперь применим наши уже имеющиеся знания для проверки того, что нам передали корректный российский номер телефона. Пусть у нас будет следующее простое правило: номер должен начинаться с +7, а далее должны идти 10 цифр от 0 до 9.
Якоря в регулярных выражениях
Также нам часто приходится говорить о начале строки. Для этого есть якорь «^».
Несмотря на то, что в строке есть два слова «кукушки», под шаблон попало только первое, так как оно находится в начале строки.
Давайте вернёмся к примеру с телефонами. В прошлый раз мы использовали шаблон «/+76<10>/». Однако, если строка содержит больше цифр в конце, то она просто отбросит лишнее.
По сути, этот телефон некорректный. Однако, с помощью якорей мы можем сделать так, что в строке будет только телефон, без лишней лабуды. Некорректный телефон не попадает в совпадение:
А корректный попадает:
Многострочный режим
Если мы сейчас запишем несколько телефонов в разных строках, то не один не подпадёт под эту регулярку.
«ИЛИ» в регулярках
Для случаев, когда нам нужно использовать что-то на выбор, либо одно, либо другое, нужно использовать конструкцию вида:
Маски
Маски это очень крутая вещь в регулярках, которая используется повсеместно. Благодаря им можно не только проверить строку на соответствие шаблону, но и выделить из неё некоторые подстроки и использовать их отдельно!
Пример задачи: нужно из строки Меняем автора статьи 123 c «Иван» на «Пётр» извлечь идентификатор статьи и имена авторов.
Вот такие вот задачи в реальном программировании встречаются повсеместно и решаются именно регулярками с использованием масок. Для того, чтобы захватить определенную часть строки, нужно поместить эту часть шаблона в круглые скобки.
Нагляднее всего это можно увидеть на примере:
Видите, справа у нас появились дополнительные совпадения? В PHP мы можем сделать из этого отдельные переменные!
Делается это проще простого:
Соответственно, нам остаётся лишь определить переменные под всё это дело:
А ещё маске можно дать имя прямо в шаблоне, вот так:
В коде будет выглядеть вот так:
И мы можем получить id статьи вот так:
Ещё один реальный пример
Практически на любом современном сайте все адреса вида: https://php.zone/post/892
Дальше он ищет статью в базе данных с таким идентификатором и возвращает её пользователю.
Это далеко не вся инфа о регулярках, но этого достаточно для 95% решения реальных задач. Забивать голову остальным и упарываться не советую 🙂
Домашка
У вас есть переменная
С помощью регулярных выражений выдерните из этой переменной 2 значения и положите их в переменные:
Шпаргалка по регулярным выражениям
Квантификаторы
Аналог | Пример | Описание | |
---|---|---|---|
? | a? | одно или ноль вхождений «а» | |
+ | a+ | одно или более вхождений «а» | |
* | a* | ноль или более вхождений «а» |
Модификаторы
Символ «минус» (-) меред модификатором (за исключением U) создаёт его отрицание.
Спецсимволы
Аналог | Описание | |
---|---|---|
() | подмаска, вложенное выражение | |
[] | групповой символ | |
количество вхождений от «a» до «b» | ||
| | логическое «или», в случае с односимвольными альтернативами используйте [] | |
\ | экранирование спец символа | |
. | любой сивол, кроме перевода строки | |
\d | 7 | десятичная цифра |
\D | [^\d] | любой символ, кроме десятичной цифры |
\f | конец (разрыв) страницы | |
\n | перевод строки | |
\pL | буква в кодировке UTF-8 при использовании модификатора u | |
\r | возврат каретки | |
\s | [ \t\v\r\n\f] | пробельный символ |
\S | [^\s] | любой символ, кроме промельного |
\t | табуляция | |
\w | [0-9a-z_] | любая цифра, буква или знак подчеркивания |
\W | [^\w] | любой символ, кроме цифры, буквы или знака подчеркивания |
\v | вертикальная табуляция |
Спецсимволы внутри символьного класса
Пример | Описание | |
---|---|---|
^ | [^da] | отрицание, любой символ кроме «d» или «a» |
— | [a-z] | интервал, любой симво от «a» до «z» |
Позиция внутри строки
Якоря
Якоря в регулярных выражениях указывают на начало или конец чего-либо. Например, строки или слова. Они представлены определенными символами. К примеру, шаблон, соответствующий строке, начинающейся с цифры, должен иметь следующий вид:
Здесь символ ^ обозначает начало строки. Без него шаблон соответствовал бы любой строке, содержащей цифру.
Символьные классы
Символьные классы в регулярных выражениях соответствуют сразу некоторому набору символов. Например, \d соответствует любой цифре от 0 до 9 включительно, \w соответствует буквам и цифрам, а \W — всем символам, кроме букв и цифр. Шаблон, идентифицирующий буквы, цифры и пробел, выглядит так:
POSIX
POSIX — это относительно новое дополнение семейства регулярных выражений. Идея, как и в случае с символьными классами, заключается в использовании сокращений, представляющих некоторую группу символов.
Утверждения
Поначалу практически у всех возникают трудности с пониманием утверждений, однако познакомившись с ними ближе, вы будете использовать их довольно часто. Утверждения предоставляют способ сказать: «я хочу найти в этом документе каждое слово, включающее букву “q”, за которой не следует “werty”».
Итак, парсер проверяет несколько следующих символов по предложенному шаблону ( werty ). Если они найдены, то утверждение ложно, а значит символ q будет «проигнорирован», т. е. не будет соответствовать шаблону. Если же werty не найдено, то утверждение верно, и с q все в порядке. Затем продолжается поиск любых символов, кроме пробела ( [^\s]* ).
Кванторы
Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если вы хотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв «a», то можно использовать этот шаблон:
Этот шаблон соответствует тексту, заключенному в двойные кавычки. Однако, ваша исходная строка может быть вроде этой:
Приведенный выше шаблон найдет в этой строке вот такую подстроку:
Он оказался слишком жадным, захватив наибольший кусок текста, который смог.
Экранирование в регулярных выражениях
Знак экранирования, предшествующий символу вроде точки, заставляет парсер игнорировать его функцию и считать обычным символом. Есть несколько символов, требующих такого экранирования в большинстве шаблонов и языков. Вы можете найти их в правом нижнем углу шпаргалки («Мета-символы»).
Шаблон для нахождения точки таков:
Другие специальные символы в регулярных выражениях соответствуют необычным элементам в тексте. Переносы строки и табуляции, к примеру, могут быть набраны с клавиатуры, но вероятно собьют с толку языки программирования. Знак экранирования используется здесь для того, чтобы сообщить парсеру о необходимости считать следующий символ специальным, а не обычной буквой или цифрой.
Спецсимволы экранирования в регулярных выражениях
Подстановка строк
Подстановка строк подробно описана в следующем параграфе «Группы и диапазоны», однако здесь следует упомянуть о существовании «пассивных» групп. Это группы, игнорируемые при подстановке, что очень полезно, если вы хотите использовать в шаблоне условие «или», но не хотите, чтобы эта группа принимала участие в подстановке.
Группы и диапазоны
Группы и диапазоны очень-очень полезны. Вероятно, проще будет начать с диапазонов. Они позволяют указать набор подходящих символов. Например, чтобы проверить, содержит ли строка шестнадцатеричные цифры (от 0 до 9 и от A до F), следует использовать такой диапазон:
Чтобы проверить обратное, используйте отрицательный диапазон, который в нашем случае подходит под любой символ, кроме цифр от 0 до 9 и букв от A до F:
Группы наиболее часто применяются, когда в шаблоне необходимо условие «или»; когда нужно сослаться на часть шаблона из другой его части; а также при подстановке строк.
Использовать «или» очень просто: следующий шаблон ищет «ab» или «bc»:
Первым параметром будет примерно такой шаблон (возможно вам понадобятся несколько дополнительных символов для этой конкретной функции):
Он найдет любые вхождения слова «wish» вместе с предыдущим и следующим символами, если только это не буквы или цифры. Тогда ваша подстановка может быть такой:
Модификаторы шаблонов
Модификаторы шаблонов используются в нескольких языках, в частности, в Perl. Они позволяют изменить работу парсера. Например, модификатор i заставляет парсер игнорировать регистры.
Регулярные выражения в Perl обрамляются одним и тем же символом в начале и в конце. Это может быть любой символ (чаще используется «/»), и выглядит все таким образом:
Модификаторы добавляются в конец этой строки, вот так:
Мета-символы
Наконец, последняя часть таблицы содержит мета-символы. Это символы, имеющие специальное значение в регулярных выражениях. Так что если вы хотите использовать один из них как обычный символ, то его необходимо экранировать. Для проверки наличия скобки в тексте, используется такой шаблон:
Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка. Она представлена в виде таблицы, помещающейся на одном печатном листе формата A4. Создана под лицензией Creative Commons на базе шпаргалки, автором которой является Dave Child. Скачать в PDF, PNG.
15 регулярных выражений PHP в помощь веб-разработчику
Регулярные выражения – это очень полезный инструмент для разработчиков. С их помощью можно находить, определять или заменять текст, слова или любые другие символы. В сегодняшней статье собраны 15 наиболее полезных регулярных выражений, которые пригодятся любому веб-разработчику.
Введение в регулярные выражения
Многим начинающим разработчикам кажется, что регулярные выражения очень сложны для понимания и использования. На самом деле, все не так уж сложно, как может показаться. Прежде чем мы непосредственно перейдем к регулярным выражениям, с их полезным и универсальным кодом, давайте взглянем на основы:
Синтаксис регулярных выражений
Регулярное выражение | Означает |
foo | Строка “foo” |
^foo | Строка начинается с “foo” |
foo$ | Строка заканчивается на “foo” |
^foo$ | «foo» встречается в строке только один раз |
[abc] | a, b, или c |
[a-z] | любой символ в нижнем регистре |
[^A-Z] | любой символ, не находящийся в верхнем регистре |
(gif|jpg) | Означает как «gif” так и “jpeg” |
[a-z]+ | Один или более символов нижнего регистра |
[0-9.-] | Любая цифра, точка или знак минус |
^[a-zA-Z0-9_]<1,>$ | Любое слово, хотя бы одна буква, число или _ |
([wx])([yz]) | wy, wz, xy, или xz |
(^A-Za-z0-9) | Любой символ (не число и не буква) |
([A-Z]<3>|8<4>) | Означает три буквы или 4 цифры |
PHP-функции для регулярных выражений
Функция | Описание |
preg_match() | Функция preg_match() ищет строку по заданному шаблону, возвращает true, если строка находится и false, в остальных случаях |
preg_match_all() | Функция preg_match_all() находит все вхождения строки, заданной по шаблону |
preg_replace() | Функция preg_replace(), действует по тому же принципу, что и ereg_replace(), за исключением того, что регулярные выражения можно использовать как для задания шаблона поиска, так и для строки, на которую следует заменить, найденное значение. |
preg_split() | Функция preg_split(), действует так же как split(), за исключением того, что регулярное выражение можно использовать в качестве параметра для шаблона поиска. |
preg_grep() | Функция preg_grep() ищет все элементы входного массива, возвращая все элементы, соответствующие шаблону регулярного выражения. |
preg_quote() | Экранирует символы регулярного выражения |
Проверка доменного имени
Проверяем, является ли строка правильным доменным именем
Подсветка слова в тексте
Это очень полезное регулярное выражение, с его помощью вы можете найти нужное слово и подсветить его. Особенно полезно для отображения результатов поиска.
Подсветка результатов поиска в WordPress блоге
Как уже говорилось в предыдущем примере, этот пример кода, удобно использовать в выдаче поисковых результатов и есть отличный способ внедрить эту функцию в wordpress-блог.
Откройте ваш файл search.php, и найдите функцию the_title(). Замените ее следующим кодом:
Теперь, выше этой строки, добавьте этот код:
Сохраните файл search.php, и откройте style.css. Добавьте следующую строку:
Получение всех картинок из HTML-документа
Если вам когда-нибудь требовалось получить все картинки с веб-страницы, этот код должен быть Вы легко сможете создать загрузчик изображений с помощью возможностей cURL
Удаление повторяющихся слов (не чувствителен к регистру)
Во время печатания, часто повторяются слова? Поможет это регулярное выражение.
Удаление повторяющейся пунктуации
То же самое, только для пунктуации. Попрощайтесь с двойными запятыми.
Поиск XML/HTML тэгов
Эта простая функция, принимает два аргумента. Первый – это тэг, который вам нужно найти, и второй – это переменная, содержащая XML или HTML. Повторюсь, эту функцию очень удобно использовать вместе с cURL.
Поиск XHTML/XML тэгов с определенным значением атрибута
Эта функция очень похожа на предыдущую, за исключением того, что вы можете задать тегу нужный атрибут. Например, вы легко сможете найти
Поиск шестнадцатеричных значений цветов
Еще один полезный инструмент для веб-разработчика! Он позволяет вам находить/проверять шестнадцатеричные значение цвета.
Поиск заголовка статьи
Парсинг логов Apache
Большинство сайтов запущено на всем известном веб-сервере Apache. Если ваш сайт находится в их числе, почему бы не использовать PHP и регулярные выражения для разбора логов апача?
Замена двойных кавычек “умными” кавычками
Если вы любитель типографики, вам понравится это регулярное выражение, заменяющее обычные двойные кавычки, на “умные кавычки”. Похожее регулярное выражение используется в wordpress в контенте страницы.
Комплексная проверка пароля
Это регулярное выражение будет следить за тем, чтобы в текстовое поле было введено не менее шести символов, цифры, дефисы и подчеркивания.
Текстовое поле должно содержать как минимум один символ верхнего регистра, один нижнего регистра и одну цифру.
WordPress: Использование регулярного выражения для получения картинок из записи
Поскольку многие из вас являются пользователями WordPress, вам возможно пригодится код, который позволяет получить все картинки, из текста статьи, и вывести их.
Для того, чтобы использовать этот код, просто вставьте его в любой файл вашей темы.
Генерация автоматических смайлов
Другая функция, используемая в wordpress – позволяет автоматически заменять символы смайлов на картинку смайла.
Перевод статьи “15 PHP regular expressions for web developers”, автор Jean-Baptiste Jung
58 комментариев
Чтобы действительно заменило повторяющиеся точки, то нужно сделать так
В ином случае просто вся строка будет заменена на одну точку.
я в замешательстве. Первый же пример не работает.
Warning: preg_match(): Unknown modifier ‘/’
и само собой
Wrong url
поясните пожалуйста, в чем проблема. PHP 5.6.
Можно хоть краткое описание для представленных регулярок — что за чем проверяется, хотя бы для того же урла. Спасибо.
экранировал два слеша после протокола, ругается на модификатор /? — все еще Wrong url при любых раскладах. А без этого модификатор любой урл считается годным(
надеюсь, ты еще не умер, чтобы сработал пример нужно заменить разделитель / вначале и в конце на #
Спасибо большое за регулярки! Вы мне очень облегчили труд 🙂
Большое спасибо, час не получалась регулярка, пока не наткнулся на ваш сайт.