Уже ни для кого не секрет, что основным способом проверки веб-форм являются регулярные выражения. Хотя в языках программирования и появились функции, комментирующие кавычки и слеши, знание синтаксиса регулярных выражений может пригодиться. Поэтому предлагаю перейти к главной части.
Метасимволы
Метасимволы делятся на две группы. Одни из них действуют внутри шаблонов вообще, а другие внутри символьных определений.
"()" обозначают начало и конец второстепенного шаблона.
"[]" - начало и конец символьных определений.
Обратный слеш перед некоторыми буквами означает их служебную функцию, например "\n" означает переход на новую строку, а "\" перед "+-\()[]{}" означает их реальное значение. ^ в начале символьного определения говорит о том, что выражение не должно содержать таких символов, поэтому шаблон "[^aeiouy]" значит что символ не является гласной.
Вне квадратных скобок те же символы имеют обратное значение: например, знак "\d" означает число, "\D" – все кроме чисел, знак "^" означает начало выражения, а знак $ - конец.
Выражение "{x,y}" , где x и y – числа(x
* - {0,}
? – {0,1}
"." означает любой символ, кроме перехода на новую строку. Так для выделения комментариев в C++ подойдет шаблон (/\*.*\*/). Ему соответствует строка, заключенная между "/*" и
"*/".
Альтернатива
Теперь о конкретных случаях. Например, полный номер телефона можно записать так "+7-095-1234567" или "8-095-1234567" не создавать же два шаблона. Для таких случаев и предусмотрены альтернативы, вводимые знаком "|". Итак, "((8|\+7)\-(\d{3})\-(\d{5,}))" и есть нужный шаблон. Поясню: сначала идет выбор между "+7" и "8", далее "-" и трехзначный код, опять "-" и 5 или более цифр.
Проверки(Assertions)
Для того, чтобы проверить строку на наличие в следующей позиции другой строки используются шаблоны следующего формата:
"qwe(?=rty)" означает, что после "qwe" следует "rty"
"qwe(?!rty)" означает, что после "qwe" не следует
"rty"
Шаблону "[a-z]{3,10}(?<=qwe)" соответствует строка от трех до десяти символов, заканчивающаяся на "qwe", то есть примененный к строке "asdqwerty", шаблон выберет из нее "asdqwe".
А строка, соответствующая шаблону "[a-z]{1,10}(?
Таким образом можно задать и проверку Интернет-адреса, используя шаблон :
((http|ftp)\://((.(?
Сначала идет выбор между строками "http" и "ftp", далее "://". Затем идет последовательность любых символов(не являющихся "/"), завершающаяся точкой и комбинацией из двух трех или четырех букв и цифр (опция (?i) означает, что буква может быть как строчной, так и прописной). Далее идут "/" и любые другие символы. Тоже можно сделать и без конструкции(?
С увеличением длины строки увеличивается и время ее проверки, так шаблон "((\d+)qwe)", примененный к строке "123456789asd" будет работать примерно так:
9 цифр + qwe – не подходит,
8 цифр + qwe – не подходит,
7 цифр + qwe – не подходит,
и так вплоть до 1 цифры. Если строка длиннее, то сервер может просто зависнуть. Для предотвращения такой траты ресурсов и были придуманы одноразовые шаблоны. Вводятся они выражением ">?". Если шаблон "((?>\d+)qwe)" дошел до числа 9 и не удовлетворен результатом, то он не возвращается в начало, а продолжает проверку.
Рекурсивные шаблоны
Вместо создания вложенных шаблонов можно ввести рекурсию, обозначаемую в регулярных выражениях знаком "(?R)". Например шаблон "(\(((?>[^()]+)|(?R))*\))", примененный к строке "(abcd(ef(ghi)" оставит строку "(ghi)". Разберемся:
Сначала открывающаясяся скобка,
Затем последовательность любых символов кроме скобок,
Если попадаем на открывающуюся скобку,
начинаем все заново, пока не встретим закрывающуюся скобку.
Условные шаблоны
Условные шаблоны названы условными, так как они соответствуют какому-либо условию. Они вводятся конструкциями
(?(условие)выражениееслида) и (?(условие)выражениееслида|
выражениееслинет). Вернемся к нашим баранам…… нет, шаблонам. Телефонный номер можно вводить с кодом города и без, тогда используя шаблон"((?(?<=8\-)\d{3}\-)[0-9]{4,7})"
мы добиваемся желаемого. Поясню: сначала шаблон проверяет, начинается ли выражение на "8-", если да, то он принимает код города и телефон от 4х до 7ми символов, иначе шаблону соответствует только номер телефона.
Выводы
Я рассказал лишь о ключевых элементах шаблонов, оставив позади некоторые тонкости, тем не менее, остается ясно, что шаблоны предоставляют огромный контроль над информацией. Любую последовательность символов можно описать используя шаблоны. Единственное, что мешает – это различие форматов. Дело в том, что шаблоны могут
соответствовать стандарту POSIX или PCRE (Perl Compatible Regular Expressions). Хотя особых различий в них нет, разные языки предоставляют свои функции для каждого стандарта, но это уже совсем другая история…