Несмотря на то что регулярные выражения достаточно мощные благодаря своим оригинальным правилам, присущие им ограничения могут сузить их применение. Например, не существует регулярного выражения, которое можно использовать для обозначения концепции "любой символ". Вдобавок, если вам случится указать скобку или звездочку в качестве регулярного выражения, вы потерпите неудачу.
Для преодоления этих ограничений практическая реализация регулярных выражения была расширена для включения множества дополнительных правил:
• Специальный символ Л применяется для указания начала строки.
• Специальный символ $ используется для указания конца строки.
Использование PHP для разработки Web-приложений
• Специальный символ . служит для указания выражения "любой символ".
• Любой нецифровой символ, который следует за символом \, интерпретируется как литерал (вместо того, чтобы интерпретироваться в соответствии с его значением как регулярного выражения). Следует отметить, что техника отмены зависит от компилятора регулярных выражений, а не от самого РНР. Это означает, что вы должны обеспечить, чтобы действительный символ обратного слэша передавался в регулярные выражения (то есть, если вы применяете двойные кавычки, то должны вводить комбинацию \\). Любое регулярное выражение, за которым следует символ +, представляет собой один или более экземпляров этого регулярного выражения.
• Любое регулярное выражение, за которым следует выражения типа {min [, | , max]} является регулярным выражением, составленным из произвольного числа экземпляров этого регулярного выражения. Параметр min означает минимальное допустимое число экземпляров, в то время как параметр max, если он задан, означает максимально допустимое количество экземпляров. Если указано только запятая, никакого верхнего предела на количество экземпляров, содержащихся в строке, не накладывается. И, наконец, если указано только min, это означает только допустимое число экземпляров.
• Квадратные скобки могут использоваться для идентификации групп символов, приемлемых в данной позиции.
Начнем с начала. Иногда удобно определить, должна ли часть регулярного выражения появляться в начале или в конце строки. Например, предположим, что вы пытаетесь определить, содержится ли в строке правильный универсальный локатор ресурсов HTTP URL. Регулярное выражение h t t p : / / может соответствовать как строке http://www.phparch.com, являющейся корректным URL-адресом, так и nhttp: //www. phparch. com, которая Таковым не является (и может быть простой опечаткой пользователя).
С помощью специального символа л можно указать, что последующее регулярное выражение должно соответствовать только началу строки. То есть, регулярное выражение Ahttp: // обеспечит совпадение только первой из двух строк.
Та же концепция касается и маркера конца строки $, означающего, что предшествующее ему регулярное выражение должно встречаться исключительно в конце строки. Например, сот$ будет соответствовать sams . com, но не communication.
Специальные символы + и ? работают подобно "звезде Клина" с тем отличием, что представляют, соответственно, "по меньшей мере, одно вхождение" и "ноль или одно вхождение" присоединенного к ним регулярного выражения.
Как уже вскользь упоминалось ранее, применение "шаблонов", которые могут задавать совпадение с любым символом, удобно в широком диапазоне сценариев, в частности, предполагая, что символ . представляет собой регулярное выражение со своим собственным правилом, так, что он может быть скомбинирован с символом звездочки
Клина и любыми другими модификаторами. Например, выражение: .+@.+\. .+ может быть использовано для указания следующего правила соответствия:
По крайней мере, один экземпляр любого символа, за которым следует символ @, за которым следует как минимум один любой символ, за которым идет символ точки, за которым идет еще один или более любой символ.
Как и можно было предположить, это выражение представляет собой очень приблизительную форму проверки корректности адреса электронной почты. Обратите внимание на то, как использован символ обратного слэша (\) для того, чтобы принудить компилятор регулярных выражений к интерпретации предпоследней точки в качестве литерального символа, а не еще одного экземпляра регулярного выражения "любой символ".
Однако это достаточно примитивный способ проверки корректности адреса электронной почты. Он допускает только буквы алфавита, символ подчеркивания (_), символ минуса (-) и десятичные цифры в части имени, домена и расширения электронного адреса. И здесь должно вступить в игру описание диапазона.
Как упоминалось ранее, все, что находится внутри квадратных скобок, представляет собой набор альтернатив для конкретной символьной позиции. Например, [abc] означает либо а, либо Ь, либо с. Однако если представлять что-либо вроде "любого символа", включая все возможные варианты в квадратные скобки, это породит абсурдно длинное и сложное регулярное выражение.
К счастью, есть возможность указать "диапазон" символов, разделяя их с помощью тире. Например, [a-z] означает "любой латинский символ нижнего регистра". Вы можете указать подобным образом более одного диапазона и комбинировать их с индивидуальными символами, размещая их один за другим. Например, наша проверка корректности электронного адреса может быть осуществлена с помощью выражения [A-Za-zO-9_], что приведет все регулярное выражение к следующему виду: [A-Za-zO-9_]+@[A-Za-zO-9_]+\. [A-Za-zO-9_] +
Спецификации диапазона, которые мы рассмотрели, являются включающими, то есть они сообщают компилятору регулярных выражений, какие символы могут присутствовать в строке. Иногда более удобно использовать исключающие спецификации, определяющие, что допускаются любые символы, кроме указанных. Это может быть достигнуто включением символа Л в спецификацию внутри квадратных скобок. Например, [AA-Z] означает "любой символ, кроме латинских букв верхнего регистра".
Возвращаясь к регулярному выражению проверки адреса электронной почты, мы видим, что оно все еще не настолько хорошо, как могло бы быть. Например, мы знаем, что расширение имени домена должно иметь как минимум два символа (как в . са) и как максимум — четыре (как в .info). Поэтому для обеспечения проверки этого дополнительного требования можно воспользоваться спецификатором задания минимально-максимальной длины, который уже был представлен ранее:
[A-Za-zO-9J+@[A-Za-zO-9_]+\. [A-Za-zO-9_] {2,4}
Естественно, вы можете пожелать, чтобы принимались только адреса с трехсимвольными расширениями (такими как . com). Этого можно достичь, исключив запятую и параметр max из спецификатора длины:
[A-Za-zO-9_]+@[A-Za-zO-9_]+\.[A-Za-zO-9_]{3}
С другой стороны, если вы хотите оставить открытым ограничение максимальной длины, предполагая тот факт, что в будущем могут появиться более длинные расширения доменных имен, можете применить такое регулярное выражение:
[A-Za-zO-9_]+@[A-Za-zO-9_]+\.[A-Za-zO-9_]{3,}
Это означает, что последняя часть выражения может повторяться, минимум, три раза, без ограничения верхнего предела.
|