Регулярные выражения
![]() |
Я уже рассказывал про операции со строками. И для поиска в строке я ограничивался только точным вхождением подстроки в строку. Думаю настало время расширить наши с вами возможности. Последние несколько дней я изучал регулярные выражения и теперь готов о них рассказать. С помощью этой замечательной вещи можно задать любой шаблон и найти в строке, что угодно. Для регулярных выражений мы будем использовать только одну функцию php: preg_match(“шаблон”, “строка_поиска”, массив_результата). |
Как работает механизм регулярных выражений ? Очень просто. Функция preg_match() передаёт шаблон и строку поиска механизму поиска совпадений и выдаёт результат в массив.
С регулярными выражениями можно строить шаблоны любой сложности, но для этого надо много инструментов.
Например:
“qwe” будет соответствует любой строке, которая будет содержать “qwe”.
“[qwe]” такому регулярному выражению подойдет строка, содержащая “qwe” или каждый из этих символов по отдельности.
Нельзя обойтись и без метасимволов.
\ – такая штука нужна, чтобы обозначит другие символы, которые вы хотите использовать виде обычных. Например:
Если вам нужна точка, то вы должны обозначить её как \. Так как просто точка будет обозначать любой символ.
“[а-Я]” так я указал все буквы русского алфавита
“[0-9]” а так все цифры.
Если хотите исключить нужные символы, надо поставить отрицание символом ^
“[^qwe]” означает все символы, кроме “qwe”
qwe123 и asd456
Давайте сделаем шаблон, для нахождения этих строк.
Можно пойти в лоб и получить вот такую конструкцию [a-z][a-z][a-z][0-9][0-9][0-9]
А можно использовать {} и указать кол-во символов следующим образом
[a-z]{3}[0-9]{3}
Согласитесь, так намного удобнее.
Такой способ указания количество символов в регулярных выражениях не является единственным.
[a-z]{1,3} разрешает вхождение от 1 до 3-х символов в строку.
[a-z]{3,} даст результат, только если встретится минимум 3 латинских буквы.
Если не хотите морочиться со скобками можно использовать следующие приёмы.
[0-9]* означает, что подряд может идти неограниченное количество цифр или же ни одной.
[0-9]+ разрешает минимум одну цифру без ограничения максимума
[0-9]? означает, что цифра может отсутствовать или же находиться в одном экземпляре.
Теперь рассмотрим случай, когда строка содержит только шаблонные символы.
Например: Отыщем в строке rty123 подстроку rty123
Для этого воспользуемся маркерами начала и конца строки ^ и $ соответственно.
$stroka = “qwerty123″; Такая строка уже не подойдет под условие, ибо мы чётко указали границы.
Слеши / / нужны, чтобы выделить регулярное выражение.
Всё хорошо, но если надо выделить пробел? Для подобных ситуаций(особенно когда регулярное выражение очень большое) можно воспользоваться спецсимволами.
• \s – таким образом объявляется пробел “[azd\s]”
• \S – наоборот все символы не совпадающие с /s
• \d – тоже самое, что и [0-9]
• \D – все, кроме цифр
• \w – сюда входят все символы, встречаемые в словах [a-zA-Z_]
• \W – все кроме /w
Давайте уже напишем, что-нибудь полезно. А например функцию обработки правильности ввода e-mail. Очень полезная вещь не так-ли ?
Form.html
Index.php
if($_REQUEST['email']!='')
{
$email = htmlspecialchars($_REQUEST['email']);
if(!preg_match("/^[0-9a-z_\.\-]+@[0-9a-z_\.\-]+\.[a-z]{2,6}$/i", $email))
echo "вы ввели неверный e-mail";
else
echo "e-mail введён верно";
}
?>
Из всего этого нас интересует, только регулярное выражение
“/^[0-9a-z_\.\-]+@[0-9a-z_\.\-]+\.[a-z]{2,6}$/i”,
Что же оно делает?
Как вы знаете, имя e-mail может состоять из латинских букв, цифр и знака подчеркивания.
[0-9a-z_\.\-]+[означает, что выше перечисленные символы должны встретиться как минимум 1 раз.
@ затем идёт обязательно этот символ, причём только в единственном экземпляре.
[0-9a-z_\.\-]+ потом, как вы знаете, идёт название вашего провайдера, которое также содержит только цифры и латинские буквы плюс символ подчёркивания и тире.
\.[a-z]{2,6} ну и таким образом, мы говорим, что доменное имя может содержать только или от 2 до 6 латинских букв.
Символ i в конце нужен, чтобы сказать регулярному выражению о регистронезависимости символов. То есть qwe и QWE будет означать одно и тоже.
Ах да, еще забыл сказать об одной интересной вещи. В регулярных выражениях можно использовать логическое ИЛИ.
“/^(yes)|(no)$/” даст результат, только если строка будет ввиде слова yes или no.
Надеюсь вы теперь, тоже поняли, что такое регулярные выражения







Август 1st, 2008
Любопытная статья, кстати автору хочу предложить установить от яндекс.денег полезную фишку на сайт “Дай рубль”. Я бы дал, так сказать на поддержание.
Август 2nd, 2008
Хм. Неплохая идея
Сентябрь 7th, 2008
Без особого преувеличения можно точно сказать, что пост тему раскрыл на все 100 процентов.
Октябрь 30th, 2008
На мой взгляд, статья очень слабая, сумбурная. И человеку, который не знаком с регулярными выражениями практически ничего не даёт.
Опять же, этот избитый и затасканный пример с проверкой правильности ввода e-mail`а. Вот честно – ну нельзя же тупо копировать одно и то-же. Придумайте что-то своё.Тем более – в других статьях попадаются очень интересные решения.
А этот пример из мануала по php и ещё из ооочень многих мест – затаскан до невозможности.
Я бы рекомендовал новичкам почитать вот эту статью, которая для меня очень многое разъяснила:
[ссылка]
Лучшего для новичка я пока не встретил (а перечитал не мало).
А в целом, блог очень интересный, спасибо авторам. Занёс в закладки, буду читать архив.
Октябрь 30th, 2008
2 Redmonk: Спасибо и за критику и за небольшую хвальбу
Как-нибудь рассмотрим тему регулярных выражений подробнее
Февраль 19th, 2009
Мне кажется, что в регулярном выражении, проверяющим правильность e-mail закралась ошибка – в названии домена не может символа подчеркивания “_”, или я не прав?
Февраль 19th, 2009
Хороший вопрос
Надо посмотреть, может ли имя домена содержать знак подчеркивания.
Июль 8th, 2009
Если не может.. то это не повлияет на правильность работы.. этого выражения.. Вот если бы в названии ящика не было этого символа.. тогда уж лучше без таких выражений обходиться.. лучше когда форма работает со всеми адресами чем, кто-то у кого turu_tuturu_tuturu@turu.ru не сможет что-нит сделать.