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

Автор: Attilla Сайт: http://www.attilla.pisem.net
   
   
   Квантификаторы
   
   Естественно в RegExp реализованы средства не только для работы с одиночными символами. Существуют так называемые квантификаторы, с помощью которых указывается сколько раз должен повторять предыдущий символ. Существует несколько видов. Разберем их синтаксис, а затем проанализируем их действе на примерах.
   
   s{a,b} - символ s может быть повторен от a до b раз.
   
   s{a} - символ s может быть повторен a раз.
   
   s{a,} сивол может быть повторен a раз и более.
   
   * - предыдущий символ может быть повторен ноль или более раз, аналог {0,}.
   
   + - одно или более совпадений, аналог {1,}.
   
   ? - ноль или одно совпадение, аналог {0,1}.
   
   А теперь примеры. Выражению [[:alpha:]]{1,8} будет соответствовать число, состоящее не более чем из 8 цифр, а [[:alpha:]]{8} - только 8-разрядное числом. [A-Z]?[a-z]+ - такая комбинация будет соответствовать слову на латинице в начале которого присутствует необязательная заглавная буква. А вот комбинация k *p может соответствовать и двум буквам kp, и этим же буквам, разделенным несколькими пробелами.
   
   Для обозначения начала и конца строки используются так называемые символы-якоря - ^ и $. К примеру, выражение ^http:// проверяет на обязательное наличие в начале строки http:// . А выражение ^k.*p$ говорит о том, что строка, состоящая из любых символом должна обязательно начинаться с k и заканчиваться буквой p.
   
   Чуть выше в статье мы рассматривали операторы [], которые позволяют искать символы, перечисленные в них. Но если вам надо искать определенные группы символов. Такое возможно с помощью оператора |. Выражение t|y|p будет аналогично выражению [typ]. А вот выражению mother|father будет соответствовать строке содержащей слова mother или father.
   
   Скобки
   Использование скобок в регулярных выражениях позволяет программисту сгруппировать отдельные символы, что бы не писать одно и тоже по несколько раз. К примеру, выражение image_1\\.jpg|image_2\\.jpg|image_3\\.jpg|image_4\\.jpg можно упростить до такого выражения - image_(1|2|3|4)\\.jpg.
   
   Так же скобки, при использовании в функциях, являются операторами, разбивающими строку на части и образующими массив, значениями которого и являются эти части. К примеру, в из HTML текста нам нужно узнать содержание тегов <title> и название языка, указанного в секции <script>.
   
   eregi("<(title)>(.*)</\\1>.*<script language=\\"(.*)\\">", $HTMLtext, $Mass);
   echo "Заголовок -".$Mass[2];
   echo "Скрипт написан на языке -". $Mass[3];
   
   А теперь проанализируем данный PHP - код. Регулярное выражение содержит три группы, выделенных скобками. Первая группа содержит слово title, которое прямо в этом же выражении заменяется комбинацией \\1. Вторая группа содержит содержимое тегов <title>, а третья группа название языка программирования. Все три группы помещаются в массив $Mass с соответствующими номерами. Под номером 0 всегда будет возвращаться строка совпадения целиком.
   
   В функциях замены ereg(i)() также реализован данный метод. Допустим у на с имется строка вида name|color, и нам ее нужно преобразовать в строку вида <font color=color>name</font>. Вот как это реализуется
   
   $str = "zh0rzh|red";
   $HtmlStr = eregi_replace("(.*)\\|(.*)", "<font color=\\2>\\1</font>", $str);
   
   Здесь также строка разбивается на две группы, в первой - имя, а во второй цвет. Во втором параметре они обозначаются как \\1 и \\2. В результате мы получаем переменную, содержащую нужный нам текст.
   
   Примеры
   Приведу пару более сложных примеров, которые можно применить на практике.
   
   Проверка email на корректность
   $email = "some email";
   $reg_email = "([[:alnum:]-\\.]+". /* Имя пользователя */
   "@[[:alnum:]]+[[:alnum:]-]*[[:alnum:]]+(\\.[[:alnum:]]+)+)"; /* Имя сервера */
   if(!eregi("^$reg_email$", $email))
   {
   echo "Повторите ввод email'a";
   }
   У данного примера есть один минус. Он игнорирует возможные параметры электронного адреса. Попробуйте дополнить этот пример
   Проверка на корректность url'a, введенного пользователем.
   Здесь мы ввели дополнительную переменную $w, которую затем вставляем в само выражение.
   $url = "some url";
   $w="[:alnum:]";
   $reg_url= "((https?|ftp|gopher)://)?[$w-]+(\\.[$w-]+)*\\.[[:alpha:]]{1,7}"./* Основное имя сервера */
   "(/[$w\\_\\.-]+/?)*". /* Имена возможных подкаталогов */
   "(/[$w\\_-]+\\.[$w]+". /* Имя файла */
   "(\\?[$w\\_]+=[$w]+([&%][$w\\_]+=[$w]+)*)?)?"; /* возможные параметры передаваемые программе */
   if(!ereg("^$reg_url$", $url))
   {
   echo "Повторите ввод адреса";
   }
   Возможно, я не предусмотрел некоторые тонкости в данных регулярных выражениях.
   

Опубликовано: HTTP://WWW.R-T-F-M.INFO, pauk ©® 2000-2011.
All rights reserved.
При перепечатки ссылка на сайт обязательна.
Мнение администрации сайта не всегда совпадает с мнением автора..