Регулярные выражения
Я уже рассказывал про операции со строками. И для поиска в строке я ограничивался только точным вхождением подстроки в строку. Думаю настало время расширить наши с вами возможности. Последние несколько дней я изучал регулярные выражения и теперь готов о них рассказать. С помощью этой замечательной вещи можно задать любой шаблон и найти в строке, что угодно. Для регулярных выражений мы будем использовать только одну функцию 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
Для этого воспользуемся маркерами начала и конца строки ^ и $ соответственно.
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
<p align="center">
email* <input name="email" size="40" type="text" /> <input value="send" name="submit" type="submit" />
</form>
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.
Надеюсь вы теперь, тоже поняли, что такое регулярные выражения 😉
Любопытная статья, кстати автору хочу предложить установить от яндекс.денег полезную фишку на сайт “Дай рубль”. Я бы дал, так сказать на поддержание. 😉
Хм. Неплохая идея
Без особого преувеличения можно точно сказать, что пост тему раскрыл на все 100 процентов.
На мой взгляд, статья очень слабая, сумбурная. И человеку, который не знаком с регулярными выражениями практически ничего не даёт.
Опять же, этот избитый и затасканный пример с проверкой правильности ввода e-mail`а. Вот честно - ну нельзя же тупо копировать одно и то-же. Придумайте что-то своё.Тем более - в других статьях попадаются очень интересные решения.
А этот пример из мануала по php и ещё из ооочень многих мест - затаскан до невозможности.
Я бы рекомендовал новичкам почитать вот эту статью, которая для меня очень многое разъяснила:
[ссылка]
Лучшего для новичка я пока не встретил (а перечитал не мало).
А в целом, блог очень интересный, спасибо авторам. Занёс в закладки, буду читать архив.
2 Redmonk: Спасибо и за критику и за небольшую хвальбу Как-нибудь рассмотрим тему регулярных выражений подробнее
Мне кажется, что в регулярном выражении, проверяющим правильность e-mail закралась ошибка - в названии домена не может символа подчеркивания “_”, или я не прав? 😀
Хороший вопрос Надо посмотреть, может ли имя домена содержать знак подчеркивания.
Если не может.. то это не повлияет на правильность работы.. этого выражения.. Вот если бы в названии ящика не было этого символа.. тогда уж лучше без таких выражений обходиться.. лучше когда форма работает со всеми адресами чем, кто-то у кого не сможет что-нит сделать.