PHP (регулярний вираз) – що це таке? Приклади та перевірка регулярних виразів. Регулярні вирази (шаблони)

) я показав приклад використання регулярних виразів для знаходження певних шматків вихідного коду сторінки. Зараз ми з вами навчимося писати їх самостійно. Ця навичка допоможе писати, очищати текст від непотрібних фрагментів, шукати потрібні частини у великих обсягах тексту тощо.

Ця тема досить непроста, але я постараюся у короткій формі висвітлити найважливіші моменти. Не знаю, наскільки це в мене вийде, але сподіваюся, що користь від уроку буде.
Отже, почнемо з того, що для роботи з регулярними виразами в PHP існує кілька функцій, але найчастіше використовуються три:

  • preg_replace — пошук та заміна відповідного за регулярним виразом тексту;
  • preg_match - просто пошук по регулюванню;
  • preg_split — Пошук та розділення тексту.

Принаймні у попередніх уроках ми користувалися саме ними. Вірніше, замість preg_match був preg_match_all, але це по суті те саме, тільки останній не перериває пошук після першого знаходження. Тобто, якщо використовувати preg_match, то ми не знайдемо всі входження, а лише перше.

Вибір якої ситуації функцію використовувати досить простий. Потрібно замінити - використовуємо replace, як у випадку, коли нам потрібно було видалити непотрібні частини коду сторінки, пам'ятаєте?

$page = preg_replace("/ ^]/i", "", $page); $page = preg_replace("/ ^]/i", "", $page); $page = str_replace("",", $page);

Перший параметр функції - регулювання, що визначає, що ми шукаємо. Другий – на що замінюємо. Третій – Де шукаємо. Отже, тут ми брали змінну $page і привласнювали їй результат функції preg_replace де шукали всі input type=checkbox, а також label, що відкриваються і закриваються. Замінювали їх на», тобто просто видаляли. Сподіваюся, тут все ясно. До розбору самого виразу (першого параметра функції) ми перейдемо трохи згодом.
Був і приклад використання preg_match_all, який знадобився для пошуку всіх посилань у тексті, що залишився. Посилання нам тоді знадобилися тому, що саме в них було укладено ключові слова, які ми парсили. Ось що було:

Preg_match_all("/ ]+?>(.*?)<\/a>/uis",$page,$ok); for ($j=0; $j ".$ok[$j].""; }

Першим параметром знову ж таки є регулярка, щоб знайти всі посилання, які, природно укладені в тег «a» (якщо не товаришуєте з розміткою html, то почитайте ). Другий — змінна у якій міститься текст, яким відбуватиметься пошук. Третім параметром поставлена ​​змінна, в яку міститься результат $ok. Після цього лише залишається пройтися по всіх потрібних елементах $ok, щоб дістати потрібні нам ключові лови. Окремо слід сказати, що на виході ми отримуємо багатовимірний масив. Саме тому ми виводили його у такий складний спосіб: $ok[$j]. Щоб подивитися структуру масиву, скористайтеся функцією нижче і ви все зрозумієте.

Print_r($ok);

Ось начебто з функціями, які ми використовували для роботи, розібралися. Тепер залишається тільки навчитися писати ці регулярні висловлювання, які є першим параметром кожного з цих методів. Переходимо до найважливішого.

Як же писати регулярки

Для початку розберемо основні конструкції. Вирази мають опції. Вони задаються однією літерою і пишуться наприкінці, перед ними ставиться сліш.

Крім цього підтримуються такі метасимволи:

Метасимволи, у свою чергу, можуть мати модифікатори:

Що ж, тепер можемо перейти до розбору наших регулярок минулого уроку. Спираючись на таблички вище, спробуємо зрозуміти, що ж у нас є. Ось вираз:

/^]/i

Перший і останній сліши «/» показують, що в них йде регулярне вираження. При цьому після останнього ми поставили «i», це опція, як у першій таблиці — не враховувати регістр. Усередині слішів сама регулярна. Вона починається зі знака менше і тега input, а також все, що йде потім, до знака точки - простий текст, який потрібно шукати. А ось сама точка і символи після неї — це вже цікавіше. В даному випадку конструкція «.*?» означає будь-яку послідовність символів. Тобто, якщо поєднати просто текст і цю конструкцію, то ми виберемо весь текст після першого входження до кінця. Щоб зупинитися потрібно зустріти або тег, що закривається, «більше», або символ початку нового рядка. Ця конструкція якраз нам і дає таку можливість:

Символи в квадратних дужках з'єднані логічним АБО. Кінцем є знак «більше» АБО початок рядка.
Ось і весь вираз, у ньому ми задали умову початку, середину та умову закінчення. Чи не важко, правда? Ось ілюстрація для більшої наочності:

Давайте розберемо ще одне, щоби все закріпити. Їм ми шукали посилання:

/]+?>(.*?)<\/a>/uis

Читаємо вираз. Знову ж таки, спочатку відкидаємо сліші та опції. Прапори "uis" зрозумілі, за винятком "u", який я не описував - він показує, що ми використовуємо кодування Юнікод. Залишається не так багато. Початком є ​​тег «a», який відкривається, потім іде клас

який позначає НЕ більше або менше (що відкриває та закривається html теги), тобто будь-які символи в даному випадку. До класу додається «+?», які означають, що цей клас буде присутнім 1 або більше разів (але хоча б 1 раз точно). І потім йде html тег для тега «a». Всередині посилання є текст, який задається групою

Адже ми не знаємо, що там буде за текст, тому визначаємо таку групу. І в кінці тег «a», що закривається:

Зверніть увагу, що сліш ми екрануємо за допомогою зворотного сліша, щоб він сприймався як простий текст.

Фух. Тема справді досить складна, тут потрібна практика. Можливо я щось роблю не цілком оптимально і можна скласти інші, правильніші регулярні висловлювання, але я такий самий самоучка як і ви, тому не судіть суворо, а краще поділіться своїми варіантами в коментарях. Також, якщо щось не зрозуміло – коментарі та сторінка контактів до ваших послуг.


Одна з дуже потужних та корисних можливостей мови PHP – підтримка регулярних виразів. Багатьох програмістів, як початківців, і досить досвідчених, лякає зовнішня складність і заплутаність мови регулярних висловів. Але можу вас запевнити - це того варте. Застосування регулярних висловів істотно полегшує роботу з обробці текстів і структурованих даних.


Регулярні висловлювання - це вирази, написані спеціальною мовою.Не лякайтеся, мова досить проста для розуміння, необхідні лише досвід та практика.


Я думаю, ви неодноразово стикалися з ситуаціями, коли у вас є текст (наприклад, Microsoft Word) і вам треба знайти в ньому щось важливе. Якщо ви знаєте, що саме шукаєте - все просто: викликали діалог пошуку, ввели слово, натиснули кнопку і вуаля - текст знайдено.


Але що ви робитимете, якщо ви заздалегідь знаєте тільки тип шуканої інформації? Наприклад, перед вами стоїть завдання знайти всі адреси електронної пошти в документі на пару сотень листів. Деякі переглядатимуть документ вручну, деякі введуть у пошуку собаку (@) і шукатимуть її. Погодьтеся - обидва варіанти це каторжна невдячна праця.

Ось тут на виручку приходять регулярні висловлювання. У деякому наближенні регулярні вирази можна порівняти з масками або шаблонами, які накладаються на текст: якщо текст відповідає масці - це шуканий фрагмент. Але перед тим як розглядати застосування регулярних виразів, ми познайомимося з їхнім синтаксисом.

Регулярний вираз - це текстовий рядок, складений за певними законами та правилами. Рядок складається з символів та груп символів, метасимволів, квантифікаторів та модифікаторів.

Під символами у разі розуміються будь-які символи будь-якого алфавіту. Причому не лише читані. Ви цілком можете вставити у вираз нечитаний символ, для цього вам треба буде лише знати його код у шістнадцятковому вигляді. Наприклад:

// символи, що читаються a Е // нечитані символи і коди \x41 - те ж що буква "A" \x09 - символ табуляції

Група символів – це кілька символів, записані послідовно:

Абвг ACZms

Відразу звертаю вашу увагу - "пробіл" у регулярних виразах теж розглядається як значущий символ, тому при написанні виразів будьте уважні. Наприклад, ці грапи символів є РІЗНИМИ виразами:

АБВДДЕ АБВ ДЕ

Наступний елемент мови - метасимволи. Приставка "мета" означає, що ці символи описують інші символи або їх групи. У таблиці розглянуто основні метасимволи мови регулярних виразів:

Метасимволи для завдання спеціальних символів
() Дужки. Визначають вкладені вирази.
| Метасимвол вибору
^ Метасимвол початку рядка
$ Метасимвол кінця рядка
\n Символ перекладу рядка (шістнадцятковий код 0x0A)
\r Символ повернення каретки (шістнадцятковий код 0x0D)
\t Символ табуляції (шістнадцятковий код 0x09)
\xhh Вставка символу з шістнадцятковим кодом 0xhh, наприклад \x42 вставить латинську букву "B"
Метасимволи для завдання груп символів
. Крапка. Будь-який символ.
\d Цифра (0-9)
\D Не цифра (будь-який символ крім символів 0-9)
\s Порожній символ (зазвичай пропуск та символ табуляції)
\S Непустий символ (все, крім символів, що визначаються метасимволом \s)
\w "Словарний" символ (символ, який використовується в словах. Зазвичай всі літери, всі цифри та знак підкреслення ("_"))
\W Все, крім символів, що визначаються метасимволом \w

Метасимволи з другої половини таблиці легко запам'ятати. "d" – digit (цифра), "s" – symbol (символ), "w" – word (слово). Якщо літера велика – значить треба додати "НЕ" в описі групи.

Візьмемо для прикладу текст "На червоній майці цифри 1812, а на зеленій майці – 2009". Розглянемо приклади найпростіших регулярних виразів:

\d\d\d\d - знайде 1812 і 2009 \D - знайде всі літери, пробіли та розділові знаки \s - знайде всі прогалини в тексті.

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

Означає будь-яку цифру (те, що \d) - означає парну цифру - означає будь-який символ латницького алфавіту (у будь-якому регістрі) або цифру.

Наприклад, вираз \d\d\d у тестовому рядку знайде лише 1812, але не 2009. Цей вираз слід читати як "знайти всі послідовності з чотирьох цифр, де остання цифра дорівнює 0,2,4,6 або 8".

Нам залишилося згадати лише квантифікатори та модифікатори.

Квантифікатор- це спеціальна конструкція, яка визначає, скільки разів має зустрітися символ чи група символів. Квантифікатор записується у фігурних дужках "()". Можливі два формати запису: точний та діапазонний. Точнийформат записується так:

Тут Х - це кількість разів, яке має повторитися попередній символ чи група. Наприклад вираз

Друга форма запису – діапазонна. Записується як

(X, Y) // або (Y) // або (X,)

де X – мінімальна, а Y – максимальна кількість повторень. Наприклад:

читається як "від двох до чотирьох послідовно записаних цифр". Якщо один із кордонів не зазначено, то мається на увазі відсутність обмеження. Наприклад:

\ w (3,) - Три і більше букв. \d(,5) - цифр немає взагалі, або є, але не більше ніж п'ять.

Квантифікатори можуть застосовуватися як до одного символу, так і до групи:

[А-Яа-я] (1,3)

Ця конструкція вибере з тексту всі російські слова з однієї, двох або трьох літер (наприклад, "або", "не", "я", "іду" тощо)

Крім фігурних дужок існує ще три метасимволи-квантифікатори: "*" (зірочка), "+" (плюс) і "?" (Питання). Їх використовують у випадках, коли заздалегідь невідомо мінімальну та максимальну кількість необхідних повторень. Наприклад, при пошуку адрес електронної пошти не можна заздалегідь сказати, скільки символів буде в імені користувача (до "собаки"), а скільки - в імені домену (після "собаки").

Метасимвол "*" читається як "будь-яка кількість від нуля і більше", тобто. конструкція

визначає будь-яку кількість послідовних літер, у тому числі їх повну відсутність.

Символ "+" відрізняється від зірочки лише тим, що вимагає наявності хоча б одного символу. Тобто. конструкція

відповідає будь-якій цифровій послідовності, де цифр одна чи більше.

Символ "?" відповідає відсутності чи наявності єдиного символу. Тобто. конструкція

відповідає будь-якій цифровій послідовності, де цифр одна чи дві.

Тут варто згадати про таку особливість антифікаторів "*" та "+" як жадібність. Суть у тому, що ці символи за промовчанням відповідають максимально довгій послідовності символів. Наприклад, для рядка "мама мила раму" вираз:

обере "мама мила ра", що дещо несподівано, адже ми припускали отримати "ма". Для зміни такої поведінки використовується метасимвол "?" (Знак питання), записаний відразу після квантифікатора. Він організовує "апетит" квантифікаторів, змушуючи їх повертати перший збіг, а не найдовше. Тепер змінимо попередній приклад:

і отримаємо необхідний збіг "ма".

Останній елемент мови модифікатори. Модифікатор – це спецсимвол, що визначає "системні" параметри аналізу регулярних виразів. Таких символів всього чотири, вони можуть застосовуватися як окремо, так і одночасно:

i Включає в себе режим case-insensitive, тобто. великі і малі літери у виразі не відрізняються.
m Вказує на те, що текст, яким ведеться пошук, повинен розглядатися як що складається з декількох рядків. За замовчуванням механізм регулярних виразів розглядає текст як один рядок незалежно від того, чим він є насправді. Відповідно, метасимволи "^" і "$" вказують на початок і кінець всього тексту. Якщо ж цей модифікатор вказано, вони будуть вказувати відповідно на початок і кінець кожного рядка тексту.
s За замовчуванням метасимвол "." не включає своє визначення символ перекладу рядка. Тобто. для багаторядкового тексту вираз /.+/ поверне лише перший рядок, а не весь текст, як очікується. Вказівка ​​цього модифікатора знімає обмеження.
U Робить усі кількісні метасимволи "не жадібними" за умовчанням. У деяких модифікаціях мови (зокрема PHP) замість "U" використовується символ "g", більш відповідний сенсу ("g" - скорочення від англійського "greedy", "жадібний").

У таблиці наведено найбільш популярні та необхідні приклади регулярних виразів. Деякі з них можуть здатися вам складними і громіздкими, але при детальному вивченні ви без сумніву розберетеся.

Регулярні вирази у PHP.

Для роботи з регулярними виразами в PHP призначені спеціальні функції, список яких і короткий опис наведено в таблиці:

int preg_match (string pattern, string subject [, array matches])

Функція перевіряє, чи збігається вміст subject із шаблоном pattern. Повертає 1 якщо збіги знайдені, інакше повертає 0. Якщо вказати необов'язковий параметр-масив matches, то при виконанні функції в нього будуть занесений єдиний елемент - перший знайдений збіг.

"; print_r($found); ?>

int preg_match_all (string pattern, string subject, array matches [, int order])
Функція ідентична попередньої, з єдиною відмінністю - вона здійснює пошук по всьому тексту і повертає в масиві matches ВСІ знайдені збіги.
mixed preg_replace (mixed pattern, mixed replacement, mixed subject [, int limit])
Як і обидві попередні функції, preg_replace здійснює пошук фрагмента тексту, що відповідає шаблону. Усі знайдені фрагменти функція замінює на вказаний у параметрах текст.До очищення:\n$text\n\n"; $text = preg_replace("/(\n \s(2,))/"," ",$text); echo " Після очищення:\n$text"; // виведе текст, очищений від спецсимволів // і зайвих прогалин?>
mixed preg_replace_callback (mixed pattern, mixed callback, mixed subject [, int limit])
Функція є розширеною попередньою версією. Головна відмінність - цієї функції в параметрах передається ім'я функції, яка буде аналізувати текст і формувати текст, що заміщає.
array preg_split (string pattern, string subject [, int limit [, int flags]])
Ця функція подібна до функцій explode() і split(). Її особливість у тому, що як роздільник виступає не фіксований рядок, а регулярне вираження. Функція розбиває вихідні дані на елементи та поміщає їх у вихідний масив.
array preg_grep (string pattern, array input)
Функція призначена для регулярного пошуку масивах. Для пошуку задається шаблон та масив вхідних даних, а повертається масив, що складається лише з елементів, що відповідають шаблону.

Розглянутий список функцій не повний, але цілком достатній для успішного початку роботи з регулярними висловлюваннями. Якщо ви зацікавилися цією темою – обов'язково почитайте додаткову літературу (наприклад, книгу Фрідла "Регулярні вирази"). Крім того, з метою навчання рекомендую поставити одну із спеціальних програм для тестування регулярних виразів (наприклад, "PCRE" або "RegEx Builder").

Почнемо з того, що таке регулярне вираження. Ось дайте відповідь мені на запитання, чи є в слові "test" літера "e"? "Є!" скажете Ви. Тоді я поставлю Вам друге питання, як ви знайшли букву "e" у слові "test"? Відповідь очевидна, беремо перший символ, тобто "t" порівнюємо його з тим, що шукаємо, тобто з "e". Якщо вони не рівні, то беремо другий символ, тобто "e", порівнюємо його з тим, що шукаємо, тобто "e". Вуаль! Знайдено збіг. Відповідь: У слові "test" є буква "e".

А тепер дайте мені відповідь на ще одне запитання, де в цьому прикладі регулярне вираження? Сподіваюся Ви здогадалися, що регулярним виразом є те, що ми шукаємо в слові "test". Тобто буква "e" у цьому прикладі і є регулярним виразом.

Навіщо використовують регулярні висловлювання в php? У моїй практиці регулярні вирази використовувалися, наприклад, для визначення, чи коректно складено адресу електронної пошти. Також такі висловлювання використовують визначення коректності ім'я користувача і пароля. За допомогою регулярних виразів можна знайти у посиланні адресу та зберегти її. Багато чого можна робити Проаналізувавши це можна виявити головну функцію регулярних виразів і дві побічні. Головна функція, це пошук збігів у рядку. Побічні ж - це збереження знайдених збігів і заміна.

Перший регулярний вираз

Теоретично ми розуміємо як знайти символ " e " у слові " test " , як це реалізується практично? Для використання регулярних виразів у php зазвичай використовують функції:

preg_match("регулярний вираз (шаблон)", "змінна в яке проводиться пошук", "Змінна в яке зберігається результат пошуку (не обов'язковий параметр)"); - Функція пошуку відповідностей
preg_replace("регулярний вираз (шаблон)", "На що замінити знайдений збіг", "змінна в яке проводиться заміна"); - функція заміни

Почнемо використовувати ці функції.. Ось приклад пошуку символу "e" в слові "test":

$a="test";
if(preg_match("/e/",$a)) echo "знайдено!!";

У коді описана умова, якщо в змінній $a знайдено щось за шаблоном, видати повідомлення "знайдено!!" Як ви могли помітити наш шаблон стоїть між двома "/". У цьому випадку символ "/" символізує початок та кінець нашого шаблону. Сподіваюся, це зрозуміло.

Все це звичайно цікаво ... але ось тільки наш шаблон, який вже дуже простий, не знаходите? Адже рідко нам потрібно знайти якийсь символ у змінній. У більшості випадків нам необхідно знайти багато символів, до того ж ще й невідомих. Як же бути? Давайте поставимо собі завдання, і спробуємо її вирішити. Припустимо, у нас є рядок, що складається з цифр і однієї невідомої англійської літери.

Як знайти цю літеру? Там може бути будь-яка літера англійського алфавіту, як її визначити? Ви самі відповіли на своє запитання, там будь-яка літера, тобто вона знаходиться в діапазоні від a до z. У регулярних виразах можна використовувати діапазони. Якщо ми не знаємо який символ шукаємо, але точно знаємо, що цей символ є буквою англійського алфавіту, то запис буде наступний:

$a = "123a321";
if(preg_match("//",$a)) echo "знайдено!!";

Зауважте, що діапазон ставиться в "[""]" дужках. Все що укладено в такі дужки визначається як одинсимвол, у разі символ варіюється в діапазоні від a до z. Якщо ж нам знадобиться знайти не букву, а цифру, то запис буде такий:

$a = "abc1cba";
if(preg_match("//",$a)) echo "знайдено!!";

Також хочу зауважити, що регулярні вирази чутливі до регістру, тому символи "A" і "a" абсолютно різні, для пошуку тих і тих символів, пишуть так:

$a = "123a321";
if(preg_match("//",$a)) echo "знайдено!!";

Також існує пошук російських букв, здійснюється так само як і з англійськими:

$a = "123-321";
if(preg_match("/[а-яА-Я]/",$a)) echo "знайдено!!";

Метасимволи

Ми навчилися шукати невідомий символ у рядку. Що ж робити, якщо нам необхідно знайти кілька символів? На допомогу приходять так звані метасимволи... Припустимо, у нас є рядок з циферками, літерами, як його описати в шаблоні? Можна так:

рядок – 123а321
шаблон -

Хм... шаблон справді підходить до нашого рядка, і при перевірці на відповідність дасть довгоочікуване true! Але якийсь громіздкий запис, Вам не здається?

Ось як її можна скоротити:

рядок – 123а321
шаблон - *

Мені здається так коротше Що ж являє собою символ "*"? Це і є той самий метасимвол, він означає, що описаний нами символ (а саме символ який може містити цифри від 0 до 9 або літери англійського алфавіту, від a до z) може повторюватися до нескінченності разів, або ж не одного разу. Так Так! Цей метасимвол знайде збіг у порожній змінній, тому що навіть відсутність описаного нами символу видасть true! Запам'ятайте це

Які ще бувають метасимволи?

Наприклад метасимвол "+" Він майже схожий з метасимволом "*" за одним маленьким винятком. "*" видасть true навіть за відсутності символу, а "+" перевірить наявність хоча б одного символу. Тобто якщо в рядку потрібна наявність мінімумодного символу використовуйте "+" замість "*"

Також часто використовують метасимвол "?" Він означає, що в рядку має бути не більше одного шуканого символу. Давайте я наведу кілька прикладів для двох останніх, описаних мною метасимволів.

Припустимо, нам необхідно перевірити на коректність пароль користувача. Давайте подумаємо, що повинен містити пароль користувача? Ну по-перше він повинен бути не меншим за один символ. По-друге він повинен містити тільки цифри та літери англійського алфавіту, отже регулярний вираз виглядатиме ось так:

$a = "qwerty12345";

Які символи дозволили? Англійські літери будь-якого регістру та цифри. Тепер спробуйте замість пароля залишити порожній рядок.

$a = "";
if(preg_match("/+/",$a)) echo "Пароль вірний";

Вам не з'явиться повідомлення "Пароль вірний". Чому? Тому що метасимвол "+" перевірив рядок на наявність бодай одного символу.

А тепер невеликий фокус, давайте поглянемо на наш вираз, адже ми не дозволяли в ньому, ну скажемо прогалину, адже так? поставте пробіл в кінці пароля і запустіть

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "Пароль вірний";

І чому ми бачимо наше повідомлення про коректний пароль? Все досить просто... Функція preg_match(); зупиняє свою перевірку при першому ж збігу. Тобто символ "q" підходить під описаний нами шаблон, а все інше для функції вже не важливо. Що ж робити? Ось як це виправити:

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "Пароль вірний";

Додаючи "^" на початку виразу і "$" наприкінці, ми говоримо функції, що шаблон повинен відповідати всярядок. Якщо ви запустите цей код, то повідомлення не побачите, тому що наприкінці пароля стоїть неприпустимий символ - пробіл

Тепер змініть метасимвол "+" на метасимвол "?". Як Ви думаєте, що станеться? Правильне повідомлення про коректність пароля буде відсутнє, тому що в паролі більше одного символу. Сподіваюся я нормально пояснив роботу, цих трьох, часто використовуваних, метасимволів

Іноді "не" краще

Ми, як мінімум, навчилися перевіряти правильність пароля, і це добре! Давайте я Вам розповім про ще один спосіб пошуку чогось у рядку. Ось скажемо нам потрібно перевірити відсутність у рядку цифр. Як це зробити? Ось рядок:

(Я спеціально ввів у неї ці "-_+()" символи що б життя медом не здавалося...) Ми могли б скласти наступний вираз:

Але погодьтеся, адже ми не завжди знаємо які символи використовуються в рядку, але нам точно відомо, що цифр у ньому не повинно бути! Отже логічніше було б просто написати шаблон, який пропускав би рядки в яких ніцифр, а не ті, у яких присутні "О боже мій скільки ж не зрозумілих символів!". Ось приклад правильно складеного виразу для таких завдань:

$a = "a-_+()";
if(preg_match("/^[^0-9]+$/",$a)) echo "Цифр немає!";

Як же ми цього досягли? Ми ввели символ , але!поставлена ​​на початку кришка "^" ([^0-9]) говорить про те, що в рядку цього символу бути не повинноСподіваюся із цим розібралися

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

Побачив, зберіг!

Мій блог

$a = " Мій блог";
preg_match("/ /", $a);

У нашому регулярному виразі ми описали всі можливі символи, які можуть входити в посилання. Так само хочу звернути увагу на символи лапки і "/" у нашому виразі. Перед ними стоїть зворотний сліш, для чого він? Справа в тому що "/" і лапка самі по собі спецсимволи. І для того, щоб шаблон їх сприйняв як звичайні символи, нам необхідно їх екранізувати. Екранізація проводиться шляхом додавання перед спецсимволами зворотного слішу. Сподіваюся зрозуміло

$a = " Мій блог";
preg_match("/ /", $a, $b);

Ну і відповідно необхідно дописати додатковий параметр у вигляді змінної $b, в ній і зберігатиметься знайдене посилання. Також необхідно знати, що результат пошуку міститься в масив. Отже змінна $b - масив. Шукана нами інформація знаходиться під індексом 1. А це означає, що результат пошуку змінної $b. виведемо результат на екран:

$a = " Мій блог";
preg_match("/ /", $a, $b);
echo $b;

Правильна адреса, запорука успіху!

Ну і на кінець, відповідь на запитання, чи коректний e-mail? Для початку необхідно дізнатися, які символи дозволені в адресах? Наскільки мені відомо, у дозволені символи входять:

  • англійські літери, цифри, "_", "-" емммм начебто все... Виходитимемо їх цього.
  • Далі у нас йде "@"
  • Після, англійські літери
  • Далі, точка
  • І знову англійські літери...

Отже регулярне вираження буде таким:

$a = " [email protected]";
if(preg_match("/^ [email protected]+.+$/", $a)) echo "e-mail адреса складена коректно!";
else echo "e-mail адреса складена НЕ коректно!";

Що ж... Буду сподіватися, що такі записи тепер не лякають Вас, і Ви в них цілком можете розібратися.

На кінець хочу дещо сказати. Стаття вийшло громіздкою, і водночас охопила лише частину можливостей. Якщо ви читаєте цю пропозицію, то швидше за все прочитали її до кінця, від чого велике Вам спасибі

Що стосується циклу статей про розробку cms блогу, першу частину циклу оголошую закритою!Незабаром ми почнемо реалізовувати адмін панель, так що не "перемикайтеся" Якщо у Вас є якісь питання, із задоволенням відповім. Усього Вам найкращого, у мене все!

При роботі з текстами в будь-якій сучасній мові програмування розробники постійно зустрічаються із завданнями перевірки введених даних на відповідність потрібному шаблону, пошуку та заміни тестових фрагментів та іншими типовими операціями з обробки символьної інформації. Розробка власних алгоритмів перевірки призводить до втрати часу, несумісності програмного коду та складності у його розвитку та модернізації.

Бурхливий розвиток Інтернету та мов WEB-розробки зажадав створення універсальних та компактних засобів обробки текстової інформації за мінімальної кількості необхідного для цього коду. Не є винятком і популярна серед початківців та професійних розробників мова PHP. Регулярний вираз як мова текстових шаблонів дозволяє спростити завдання обробки тексту та зменшити програмний код на десятки та сотні рядків. Багато завдань взагалі неможливо вирішити без нього.

Регулярні висловлювання у PHP

Мова PHP містить три механізми роботи з регулярними виразами - "ereg", "mb_ereg" та "preg". Найбільш поширеним є інтерфейс preg, функції якого забезпечують доступ до бібліотеки підтримки регулярних виразів PCRE, спочатку розробленої для мови Perl, яка входить до комплекту PHP. Функції Preg шукають у заданому текстовому рядку збігу, згідно з певним шаблоном на мові регулярних виразів.

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

У межах короткої статті неможливо докладно описати весь синтаксис регулярних виразів, при цьому існує спеціальна література. Наведемо лише основні елементи для показу широких можливостей для розробника та розуміння прикладів коду.

У формально визначається дуже складно, і тому спростимо опис. Регулярний вираз є текстовим рядком. Вона складається з виділеного роздільником шаблону та модифікатора, що вказує на те, як його обробляти. Можливе включення до шаблонів різних альтернатив та повторень.

Наприклад, у виразі /d(3)-d(2)-d(2)/mроздільником буде «/» , далі йде шаблон, а символ "m"буде модифікатором.

Вся потужність регулярних виразів кодується за допомогою метасимволів. Основним метасимволом мови є зворотний слеш - "\". Він змінює тип наступного його символу на протилежний (т. е. звичайний символ перетворюється на метасимвол і навпаки). Іншим важливим метасимволом є пряма характеристика «|», яка задає альтернативні варіанти шаблону. Ще приклади метасимволів:

PHP, обробляючи регулярні вирази, пробіл розглядає як окремий значущий символ, тому вирази АБВГДЕ та АБВ ДДЕ є різними.

Підшаблони

У PHP регулярні підшаблони виділяються круглими дужками і іноді називаються «підвиразами». Виконують такі функції:

    Виділення альтернатив. Наприклад, шаблон жар(де|птица|)збігається зі словами «жар», «жар-птиця»і «спекотне». А без дужок це буде лише порожній рядок, «птах» та «спекотне».

    "Захоплюючий" підшаблон.Це означає, що якщо в шаблоні збігся підрядок, то як результат повертаються всі збіги. Для наочності наведемо приклад. Дано такий регулярний вираз: переможець отримує ((золоту | позолочений) (медаль | кубок)) -та рядок для пошуку збігів: «переможець отримує золоту медаль». Крім вихідної фрази, в результаті пошуку буде видано: «золоту медаль», "медаль", "золоту".

Оператори повторень (квадрифікатори)

При складанні регулярних виразів часто-густо необхідно аналізувати повторення чисел і символів. Це не проблема, якщо повторень не дуже багато. Але що робити, коли ми не знаємо їх точного числа? У такому разі необхідно використовувати спеціальні метасимволи.

Для опису повторень застосовуються квадрифікатори – метасимволи для завдання кількості. Квадрифікатори бувають двох типів:

  • загальні, укладені у дужки;
  • скорочені.

Загальний квантифікатор зачеплений мінімальним і максимальна кількістьдозволених повторень елемента у вигляді двох чисел у фігурних дужках, наприклад: х(2,5). Якщо максимальна кількість повторень невідома, другий аргумент не вказується: x(2,).

Скорочені квантифікатори є символами для найпоширеніших повторень, щоб уникнути зайвого навантаження синтаксису. Зазвичай використовуються три скорочення:

1. * - нуль і більше повторень, що еквівалентно (0,).

2. + - одне і більше повторень, т. ,).

3. ? - нуль або лише одне повторення - (0,1).

Приклади регулярних виразів

Для тих, хто вивчає регулярні вирази, приклади – найкращий підручник. Ми наведемо кілька, які показують їх широкі можливості за мінімум зусиль. Усі програмні коди повністю сумісні з версіями PHP 4.x та вище. Для повного розуміння синтаксису та використання всіх можливостей мови рекомендуємо книгу Дж. Фрідла « Регулярні вирази», де повністю розглядається синтаксис і є приклади регулярних виразів не тільки PHP, але й мов Python, Perl, MySQL, Java, Ruby і C#.

Перевірка правильності адреси E-mail

Завдання.Існує Інтернет-сторінка, на якій у відвідувача запитується адреса email. Регулярний вираз повинен перевіряти правильність отриманої адреси перед надсиланням повідомлень. Перевірка не дає гарантії, що зазначений Поштова скринькареально існує та приймає листи. Але відсіяти свідомо неправильні адреси вона може.

Рішення.Як і в будь-якій мові програмування, на PHP регулярні вирази email-перевірки адреси можуть бути реалізовані різними способами, і приклади цієї статті не є остаточним і єдиним варіантом. Тому в кожному випадку ми наводитимемо перелік вимог, які потрібно врахувати під час програмування, а конкретна реалізація повністю залежить від розробника.

Отже, вираз, що перевіряє правильність email, повинен перевіряти такі умови:

  1. Наявність у вихідному рядку символу @ та відсутність пробілів.
  2. Доменна частина адреси за символом @ містить лише допустимі символи для доменних імен. Те саме стосується і імені користувача.
  3. При перевірці імені користувача необхідно визначити наявність спеціальних символів, таких як апостроф або Такі символи відносяться до потенційно небезпечних і можуть бути у таких видах нападів, як SQL-ін'єкції. Уникайте таких адрес.
  4. Імена користувача допускають наявність лише однієї точки, яка не може бути першим або останнім символом у рядку.
  5. Ім'я домену має містити не менше двох і не більше шести символів.

Приклад, що враховує всі зазначені умови, можна побачити на малюнку.

Перевірка правильності адрес URL

Завдання.Перевірити, чи заданий текстовий рядок є допустимим Ще раз зазначимо, що регулярні вирази URL-перевірки можуть бути реалізовані різними способами.

Рішення.Наш підсумковий варіант виглядає так:

/^(https?:\/\/)?([\da-z\.-]+)\.((2,6))([\/\w \.-]*)*\/?$ /

Тепер розберемо його складові докладніше, використовуючи малюнок.

Перевіряємо номери кредитних карток

Завдання.Необхідно реалізувати перевірку правильності введеного номера пластикової картки найпоширеніших платіжних систем. Розглянуто варіант тільки для карт

Рішення.Під час створення виразу необхідно враховувати можливу наявність у введеному номері пробілів. Цифри номера на карті розділені на групи для спрощення читання та диктування. Тому цілком природно, що людина може спробувати запровадити номер таким чином (тобто використовуючи прогалини).

Написати універсальний вираз, що враховує можливі прогалини та дефіси, складніше, ніж просто відкинути всі символи, крім цифр. Тому у виразі рекомендується використовувати метасимвол /D, який видаляє всі символи, крім цифр.

Тепер можна перейти безпосередньо до перевірки номера. Усі компанії, що випускають кредитні картки, Використовуйте унікальний формат номера. У прикладі це використовується, і клієнту не потрібно вводити найменування компанії - вона визначається за номером. Картки Visaзавжди починаються з 4 і мають довжину номера 13 або 16 цифр. MasterCard починається в діапазоні 51-55 з довжиною номера 16. У результаті отримуємо такий вираз:

Перед обробкою замовлення можна провести додаткову перевірку останньої цифри номера, яка визначається за алгоритмом Місяць.

Перевірка телефонних номерів

Завдання.Перевірте правильність введеного телефонного номера.

Рішення.Кількість цифр у стаціонарних та мобільних телефонних номерахзначно різниться залежно від країни, тому універсально перевірити, використовуючи регулярні вирази, номер телефону на правильність неможливо. Але міжнародні номеримають строгий формат і відмінно підходять для перевірки шаблону. Тим більше, що все більше національних телефонних операторівнамагаються відповідати єдиному стандарту. Структура номера така:

+CCC.NNNNNNNNNNNNEEEE,де:

C – це код країни, що складається з 1-3 цифр.

N – номер довжиною до 14 цифри.

E – необов'язкове розширення.

Плюс є обов'язковим елементом, а знак х присутній лише за необхідності розширення.

В результаті маємо такий вираз:

^\+(1,3)\.(4,14)(?:x.+)?$

Числа в діапазоні

Завдання.Необхідно забезпечити збіг цілого числа з певного діапазону. Додатково необхідно, щоб регулярні вирази знаходили тільки цифри з діапазону значень.

Рішення. Наведемо кілька виразів для кількох найпоширеніших випадків:

Пошук IP-адреси

Завдання.Необхідно визначити, чи заданий рядок є допустимою IP-адресою у форматі IPv4 в діапазоні від 000.000.000.000-255.255.255.255.

Рішення.Як і в будь-якій задачі на мові PHP, регулярний вираз має безліч варіантів. Наприклад, таке:

Онлайн-перевірка виразів

Перевірка регулярних виразів на правильність для програмістів-початківців може бути складною через складність синтаксису, що відрізняється від «звичайних» мов програмування. Для вирішення цієї проблеми існує безліч онлайн-тестерів виразів, що дозволяють легко перевірити правильність створеного шаблону на реальному тексті. Програміст вводить вираз та дані для перевірки та миттєво бачить результат обробки. Зазвичай тут присутній довідковий розділ, де докладно описуються регулярні висловлювання, приклади та відмінності реалізації для найбільш поширених мов програмування.

Але повністю довіряти результатам онлайн-сервісів не рекомендується всім розробникам 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

Примітка: у квадратних дужках можна вказувати діапазони символів, але пам'ятай, що російська літера йде окремо від алфавіту і щоб написати «будь-яка російська літера», треба писати [а-яо] .

Бексліші

Якщо ти дивився інші підручники з регулярних виразів, то, напевно, помітив, що бекслеш скрізь пишуть по-різному. Десь пишуть один бекслеш: , а тут у прикладах він повторений 2 рази: . Чому?

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

Тому в деяких випадках (там, де послідовність символів має спеціальний сенс у PHP) ми зобов'язані подвоювати бекслеш:

  • Щоб написати в регулярці \$, ми пишемо в коді "\\$"
  • Щоб написати в регулярці \\, ми подвоює кожен бекслеш і пишемо "\\\"
  • Щоб написати в регулярці бекслеш та цифру (\1), бекслеш треба подвоїти: "\\1"

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

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

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

Також є зручна умова для вказівки на межу слова: . Ця конструкція позначає, що з одного боку від неї повинен стояти символ, що є буквою/цифрою/знаком підкреслення (w), а з іншого боку - не є. Ну, наприклад, ми хочемо знайти в тексті слово кіт. Якщо ми напишемо регулярку /кіт/ui , то вона знайде послідовність цих літер у будь-якому місці - наприклад, усередині слова "скотина". Це очевидно не те, що ми хотіли. Якщо ж ми додамо умову межі слова в регулярку: /\bкот\b/ui , то тепер шукатиметься лише окреме слово "кіт".

Мануал

  • Синтаксис регулярних виразів у PHP , детальний опис
gastroguru 2017