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

Я уже рассказывал про операции со строками. И для поиска в строке я ограничивался только точным вхождением подстроки в строку. Думаю настало время расширить наши с вами возможности. Последние несколько дней я изучал регулярные выражения и теперь готов о них рассказать.
С помощью этой замечательной вещи можно задать любой шаблон и найти в строке, что угодно.
Для регулярных выражений мы будем использовать только одну функцию 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 =  "rty123";
preg_match("/^[a-z]{3}[0-9]{3}$/",$stroka,$result);
print_r($result);
?>

$stroka = “qwerty123″; Такая строка уже не подойдет под условие, ибо мы чётко указали границы.

Слеши / / нужны, чтобы выделить регулярное выражение.

Всё хорошо, но если надо выделить пробел? Для подобных ситуаций(особенно когда регулярное выражение очень большое) можно воспользоваться спецсимволами.
• \s – таким образом объявляется пробел “[azd\s]”
• \S – наоборот все символы не совпадающие с /s
• \d – тоже самое, что и [0-9]
• \D - все, кроме цифр
• \w – сюда входят все символы, встречаемые в словах [a-zA-Z_]
• \W - все кроме /w
Давайте уже напишем, что-нибудь полезно. А например функцию обработки правильности ввода e-mail. Очень полезная вещь не так-ли ? 😉

Form.html

<form method="post" enctype="multipart/form-data">
<p align="center">
email*  <input name="email" size="40" type="text" /> <input value="send" name="submit" type="submit" />

</form>

Index.php

include “form.html”;
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 введён верно";
}
?&gt;

Из всего этого нас интересует, только регулярное выражение
“/^[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.
Надеюсь вы теперь, тоже поняли, что такое регулярные выражения 😉





Читайте также:



8 Ответов на “Регулярные выражения”

  1. Любопытная статья, кстати автору хочу предложить установить от яндекс.денег полезную фишку на сайт “Дай рубль”. Я бы дал, так сказать на поддержание. 😉

  2. novice

    Хм. Неплохая идея :)

  3. Павлин

    Без особого преувеличения можно точно сказать, что пост тему раскрыл на все 100 процентов. :)

  4. На мой взгляд, статья очень слабая, сумбурная. И человеку, который не знаком с регулярными выражениями практически ничего не даёт.
    Опять же, этот избитый и затасканный пример с проверкой правильности ввода e-mail`а. Вот честно - ну нельзя же тупо копировать одно и то-же. Придумайте что-то своё.Тем более - в других статьях попадаются очень интересные решения.
    А этот пример из мануала по php и ещё из ооочень многих мест - затаскан до невозможности.

    Я бы рекомендовал новичкам почитать вот эту статью, которая для меня очень многое разъяснила:
    [ссылка]

    Лучшего для новичка я пока не встретил (а перечитал не мало).

    А в целом, блог очень интересный, спасибо авторам. Занёс в закладки, буду читать архив.

  5. novice

    2 Redmonk: Спасибо и за критику и за небольшую хвальбу :) Как-нибудь рассмотрим тему регулярных выражений подробнее

  6. Мне кажется, что в регулярном выражении, проверяющим правильность e-mail закралась ошибка - в названии домена не может символа подчеркивания “_”, или я не прав? 😀

  7. novice

    Хороший вопрос :) Надо посмотреть, может ли имя домена содержать знак подчеркивания.

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


© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map