Отправляет email-рассылки с помощью сервиса Sendsay

Все о PHP и даже больше

  Все выпуски  

Все о PHP и даже больше


Информационный Канал Subscribe.Ru


Все о PHP и даже больше...

# 1
1/2002

7 ноября 2002г.

Проект сайта "GreatWeb Design" GreatWeb.dax.ru


    В этом выпуске:

  • Наш проект.
  • Регулярные выражения в PHP.
  •   Ссылки Вебмастеру:

  • Лучший хостинг
  • Раскрутка
  • Советы Web-мастеру
  • Книги о программировании
  • WEB-браузеры
  • Фоны
  • Скрипты
  • HARDWARE
  • Партнерская программа

  • Здравствуйте!

    Описание нашего проекта:



    Открылся новый сайт под названием GreatWeb Web-портал.
    На этом сайте Вы найдете последнюю информацию из Мира компьютеров и INTERNET. А также множество Скриптов: гостевые книги, возвратные формы, голосование, счетчики, поиск, форумы, чаты и многое другое,… В общем, все, что нужно для полноценного сайта.


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


    Введение

    Программируете на PHP? Часто задаетесь вопросом: "Все ли данные, введенные пользователем, являются корректными? Как это предусмотреть?" Данные проблемы легко разрешаются с помощью "регулярных выражений". А что это за зверь, и с чем его едят, рассмотрим далее. В данной статье я рассмотрю одни из стандартов регулярных выражений - RegExp.

    Функции

    Любое регулярное выражение это строка, содержащая набор специальных символов. Эта строка является этаким шаблоном для поиска подстроки. Рациональнее всего применять регулярные выражения в том случае, когда точно неизвестно что именно нужно искать. К примеру, вам нужно проверить на соответствие строки email'y или url'y сайта. Для работы с регулярными выражениями RegExp в PHP реализованы следующие функции ereg(), eregi(), ereg_replace(), eregi_replace(), split(). spliti() Рассмотрим их синтаксис:

    - ereg(string $regstring, string $str [, list $Arr])

    Функция сопоставляет выражение $regstring строке $str. В случае если искомая подстрока найдена, функция возвращает true, иначе - false. Если задан необязательный массив список $Arr, то в него записываются все найденные участки совпадения. Об этих участках немного позже. Функция eregi() имеет аналогичный синтаксис, только без учета регистра символов.

    - ereg_replace(string $regstring, string $strToChange, string $str)

    Функция ищет в строке $str подстроки, соответствующие выражению $regstring и заменяет их на строку $strToChange, которая может содержать некоторые управляющие символы. Функция eregi_replace() имеет аналогичный синтаксис, только без учета регистра символов.

    - split(string $spliter, string $str, [, $max])

    Функция возвращает массив - список, полученный в результате разбиения строки $str разделителем $spliter. Необязательный параметр $max задает максимальный размер массива. Функция split() имеет аналогичный синтаксис, только без учета регистра символов.

    Группы символов

    А теперь приступим к изучению непосредственно регулярных выражений. Для начала рассмотрим группы символов. Существует несколько спецсимволов, обозначающих сразу группу букв. Одним из таких является ".", обозначающий один любой символ. Т.е допустим выражению s.sop будут соответствовать слова sisop, sosop и т. д., но не srtsop или stusop. Допустим только один символ!

    А если вам нужно искать один из нескольких символов? Для этого есть спецсимволы [ ]. К примеру, выражению d[ty]p будут соответствовать только слова dtp и dyp. Если таковых букв много и они идут, в каком либо порядке, то их можно указывать через тире ("-"). Выражению [0-9] будут соответствовать все цифры, выражению [A-Z] любая заглавная буква латинского алфавита. Наиболее часто встречающиеся группы символов в RegExp обозначаются специальными словами заключенные между [: и :]. Вот наиболее часто используемые из них:

    [:alpha:] - буква.

    [:digit:] - цифра

    [:blank:] - пробельный символ или символ с кодом от 0 до 255.

    [:space:] - пробельный символ

    [:alnum:] - буква или цифра

    [:lower:] - символ нижнего регистра

    [:upper:] - символ верхнего регистра

    [:punct:] - знак пунктуации

    Данные комбинации должны находиться в вышеупомянутых символах [ ]. К примеру, выражение com[[:digit:]] будет обозначать комбинацию букв com и одной цифры. Но не в коем случае com[:digit:] - работать не будет.

    Существуют еще отрицательные группы, в которых указываются символы, которые должны отсутствовать в подстроках. Реализуется эту с помощью тех же [] и символа ^. Выражение [^abc] соответствует любой букве кроме латинских a, b и c.

    Если вам необходимо искать в строке символы, использующиеся в RegExp как спецсимволы, то вам необходимо их предварить двойным обратным слешем ("\\"). То есть для поиска строки $some вам необходимо создать выражение \\$some, и это относится ко всем специальным символам
    ([]{}^$|+.*?)

    Квантификаторы

    Естественно в 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 "Повторите ввод адреса";
    }

    Возможно, я не предусмотрел некоторые тонкости в данных регулярных выражениях. Если вы таковые обнаружите, сообщите мне. Мы вместе их обсудим.

    Вот и подошла моя статья к концу. Главное в регулярных выражениях - это "Практика, практика и еще раз практика" - как говорил товарищ Ленин.


    Большое спасибо сайту DWeb.RU.


    © 2002 Copyright by GreatWeb Design
    Копирование материалов рассылки возможно только в случае явного указания на сайт "GreatWeb.dax.RU" как на источник информации.


    http://subscribe.ru/
    E-mail: ask@subscribe.ru
    Отписаться
    Убрать рекламу

    В избранное