Регулярные выражения в php

 

Приветствую Вас, дорогой читатель! Если вы просматривали статьи посвященные разработке cms блога то обращали внимание на то, что я, в некоторых статьях, использовал регулярные выражение. Если вы новичок в php программирование, то скорее всего не понимаете, что это такое (извиняюсь если ошибаюсь ) Если же я все таки не ошибаюсь, то не унывайте... Я помогу Вам освоить основы этого искусство

 

 

Давайте начнем с того, что такое регулярное выражение. Вот ответьте мне на вопрос, есть ли в слове "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-z]/",$a)) echo "найдено!!";

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

$a = "abc1cba";
if(preg_match("/[0-9]/",$a)) echo "найдено!!";

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

$a = "123a321";
if(preg_match("/[a-zA-Z]/",$a)) echo "найдено!!";

Так же существует поиск русских букв, осуществляется так же как и с английскими:

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

 

Метасимволы

 

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

строка - 123а321
шаблон - [0-9][0-9][0-9][a-z][0-9][0-9][0-9]

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

Вот как ее можно сократить:

строка - 123а321
шаблон - [0-9a-z]*

Мне кажется так покороче Что же из себя представляет символ "*"? Это и есть тот самый метасимвол, он означает что описанный нами символ ( а именно символ который может содержать цифры от 0 до 9 или буквы английского алфавита, от a до z ) может повторяться до бесконечности раз, или же не одного раза. Да да! Этот метасимвол, найдет совпадение в пустой переменной, так как даже отсутствие описанного нами символа выдаст true! Запомните это

Какие еще бывают метасимволы?

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

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

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

$a = "qwerty12345";
if(preg_match("/[a-zA-Z0-9]+/",$a)) echo "Пароль верный";

Какие символы мы разрешили? Английские буквы любого регистра и цифры. Теперь попробуйте вместо пароля оставить пустую строчку.

$a = "";
if(preg_match("/[a-zA-Z0-9]+/",$a)) echo "Пароль верный";

Вам не высветится сообщение "Пароль верный". Почему? Потому что метасимвол "+" проверил строку на наличие хотя бы одного символа.

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

$a = "qwerty12345 ";
if(preg_match("/[a-zA-Z0-9]+/",$a)) echo "Пароль верный";

И почему мы видим наше сообщение о корректном пароле? Все довольно просто... Функция preg_match(); останавливает свою проверку при первом же совпадение. То есть символ "q" подходит под описанный нами шаблон, а все остальное для функции уже не важно Что же делать? Вот как это исправить:

$a = "qwerty12345 ";
if(preg_match("/^[a-zA-Z0-9]+$/",$a)) echo "Пароль верный";

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

Теперь смените метасимвол "+" на метасимвол "?". Как Вы думаете что произойдет? Правильно сообщение о корректности пароля будет отсутствовать, так как в пароле более одного символа. Надеюсь я нормально объяснил работу, этих трех, часто используемых, метасимволов

 

Иногда "не" лучше

 

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

$a = "a-_+()";

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

[a-zA-Z+-_()]+

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

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

Как же мы этого добились? Мы ввели символ [0-9], но! поставленная в начале крышка "^" ([^0-9]) говорит о том, что в строке этого символа быть не должно Надеюсь с этим разобрались

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

 

Увидел, сохранил!

 

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

<a href="http://rio-shaman.ru">Мой блог</a>

Как найти в этой ссылке, ссылку? Понятно что ссылка идет после href=". А заканчивается - "> То есть грубо говоря ссылка озвучивается между кавычками. Напишем регулярное выражение, в котором найдем ссылку:

$a = "<a href=\"http://rio-shaman.ru\">Мой блог</a>";
preg_match("/<a href=\"[a-zA-Z0-9:.\/-]+\">/", $a);

В нашем регулярном выражение мы описали все возможные символы которые могут входить в ссылку. Так же хочу обратить внимание на символы кавычки и "/" в нашем выражение.. Перед ними стоит обратный слеш, для чего он? Дело в том что "/" и кавычка сами по себе спецсимволы. И для того что бы шаблон их воспринял как обычные символы, нам необходимо их экранировать. Экранирование проводится путем добавление перед спецсимволами обратный слеш. Надеюсь понятно

Ну что ж... Мы нашли нашу ссылку, как же ее сохранить? Для сохранения достаточно искомые символы поместить в скобки, вот так:

$a = "<a href=\"http://rio-shaman.ru\">Мой блог</a>";
preg_match("/<a href=\"([a-zA-Z0-9:.\/-]+)\">/", $a, $b);

Ну и соответственно необходимо дописать дополнительный параметр в виде переменной $b, в ней и будет храниться найденная ссылка. Так же необходимо знать, что результат поиска помещается в массив. Стало быть переменная $b - массив. Искомая нами информация находится под индексом 1. А это означает, что результат поиска в переменной $b[1]. выведем результат на экран:

$a = "<a href=\"http://rio-shaman.ru\">Мой блог</a>";
preg_match("/<a href=\"([a-zA-Z0-9:.\/-]+)\">/", $a, $b);
echo $b[1];

 

Правильный адрес, залог успеха!

 

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

  • английские буквы, цифры, "_", "-" эмммм вроде все... Будем исходить их этого.
  • Дальше у нас идет "@"
  • После, английские буквы
  • Далее, точка
  • И опять английские буквы...

Стало быть регулярное выражение будет следующим:

$a = "test_1989@test.ru";
if(preg_match("/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+.[a-zA-Z0-9_-]+$/", $a)) echo "e-mail адрес составлен корректно!";
else echo "e-mail адрес составлен НЕ корректно!";

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

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

Что касается цикла статей о разработке cms блога, первую часть цикла оглашаю закрытой! В скором будущем мы начнем реализовывать админ панель, так что не "переключайтесь" Если у Вас есть какие то вопросы, с удовольствием отвечу. Всего Вам самого наилучшего, у меня все!

 

Комментарии (6)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Вы не подтвердили условия политики конфиденциальности.
ulot3049, 03 Января 2012 г. 18:53 пишет:
Гость
Спасибо Алексей, статья вышла полезной. Единственное чего не хватает это полезных примеров регулярок и описание метасимволов.
ulot3049, 03 Января 2012 г. 18:55 пишет:
Гость
Извеняюсь, не правильно указал ссылку на статью.
Вот верная:
http://lifeexample.ru/php-primeryi-skriptov/regulyarnyie-vyirazheniya-v-php.html
Rio-Shaman, 03 Января 2012 г. 19:46 пишет:
Автор
Пытался минимизировать информацию. Много букв в посте, особенно в таких, пугает народ =)
Ответ для пользователя: ulot3049
Евгений, 01 Августа 2014 г. 13:11 пишет:
Гость
Спасибо, Алексей ! Всё просто и понятно - то, что нужно для начала. Успехов и процветания тебе!!!
Фарид, 03 Мая 2015 г. 15:29 пишет:
Гость
Спасибо БОЛЬШУЩЕЕ!!! Статья очень помогла!! Желаю успехов вам. Еще раз спасибо :)
Эдуард, 22 Декабря 2016 г. 13:39 пишет:
Гость
Спасибо большое за статью!
Ответ для пользователя: Фарид