Естественно в 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>.
А теперь проанализируем данный PHP - код. Регулярное выражение содержит три группы, выделенных скобками. Первая группа содержит слово title, которое прямо в этом же выражении заменяется комбинацией \\1. Вторая группа содержит содержимое тегов <title>, а третья группа название языка программирования. Все три группы помещаются в массив $Mass с соответствующими номерами. Под номером 0 всегда будет возвращаться строка совпадения целиком.
В функциях замены ereg(i)() также реализован данный метод. Допустим у на с имется строка вида name|color, и нам ее нужно преобразовать в строку вида <font color=color>name</font>. Вот как это реализуется
Здесь также строка разбивается на две группы, в первой - имя, а во второй цвет. Во втором параметре они обозначаются как \\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 "Повторите ввод адреса";
}
Возможно, я не предусмотрел некоторые тонкости в данных регулярных выражениях.