PHP 5 » PCRE

Модификаторы PCRE

Ранее говорилось, что вам нужно указывать разделители для PCRE. Если это вызывает удивление, то вот объяснение: в PCRE введена концепция “модификаторов”, ко* торые могут быть добавлены к регулярному выражению для изменения поведения компилятора и/или интерпретатора регулярных выражений. Модификатор всегда добавляется в конец выражения, сразу после разделителя. Например, в следующем регулярном выражении:
/test/i
последнее i — это модификатор. (more…)

Tags: , ,

Related posts

Ограничения базового синтаксиса

Несмотря на то что регулярные выражения достаточно мощные благодаря своим оригинальным правилам, присущие им ограничения могут сузить их применение. Например, не существует регулярного выражения, которое можно использовать для обозначения концепции “любой символ”. Вдобавок, если вам случится указать скобку ИЛИ звездочку в качестве регулярного выражения, вы потерпите неудачу.
Для преодоления этих ограничений практическая реализация регулярных выражения была расширена для включения множества дополнительных правил:
• Специальный символ ” применяется для указания начала строки.
• Специальный символ $ используется для указания конца строки.• Специальный символ . служит для указания выражения “любой символ1″.
• Любой нецифровой символ, который следует за символом \т интерпретируется как литерал (вместо того, чтобы интерпретироваться в соответствии с его значением как регулярного выражения). Следует отметить, что техника отмены зависит от компилятора регулярных выражений, а не от самого РНР, Это означает, что вы должны обеспечить, чтобы действительный символ обратного слэша передавался в регулярные выражения (то есть, если вы применяете двойные кавычки, то должны вводить комбинацию \\). Любое регулярное выражение, за которым следует символ +, представляет собой один или более экземпляров этого регулярного выражения.
• Любое регулярное выражение, за которым следует выражения типа {win [, |, max] } является регулярным выражением, составленным из произвольного числа экземпляров этого регулярного выражения. Параметр min означает минимальное допустимое число экземпляров, в то время как параметр шхт если он задан, означает максимально допустимое количество экземпляров. Если указано только запятая, никакого верхнего предела на количество экземпляров, содержащихся в строке, не накладывается. И, наконец, если указано только min, это означает тальк о допустимое число экземпляров.
• Квадратные скобки могут использоваться для идентификации групп символов, приемлемых в данной позиции.
Начнем с начала. Иногда удобно определить, должна ли часть регулярного выражения появляться в начале или в конце строки. Например, предположим, что вы пытаетесь определить, содержится ли в строке правильный универсальный локатор ресурсов HTTP URL. Регулярное выражение http:// может соответствовать как строке http: / /www .phparch. com, являющейся корректным URL-адресом, так и nhttp: / /www.phparch. com,, которая Таковым не является (и может быть простой опечаткой пользователя).
С помощью специального символа Л можно указать, что последующее регулярное выражение должно соответствовать только началу строки. То есть, регулярное выражение “http: / / обеспечит совпадение только первой из двух строк.
Та же концепция касается и маркера конца строки S, означающего, что предшествующее ему регулярное выражение должно встречаться исключительно в конце строки. Например, comS будет соответствовать sams . com, но не communication.
Специальные символы + и ? работают подобно “звезде Клина”‘ с. тем отличием, что представляют, соответственно, “по меньшей мере, одно вхождение” и “ноль или одно вхождение” присоединенного к ним регулярного выражения.
Как уже вскользь упоминалось ранее, применение “шаблонов”, которые могут задавать совпадение с любым символом, удобно в широком диапазоне сценариев, в частности, предполагав, что символ . представляет собой регулярное выражение со своим собственным правилом, так, что он может быть скомбинирован с символом звездочки Клина и любыми другими модификаторами. Например, выражение:
.+8. + \..+
может быть использовано для указания следующего правила соответствия:По крайней мере, одни экземпляр любого символа, за которым следует символ @, за кош-рым следует как минимум один любой символ, за которым идет символ точки, за которым идет еще один или более любой символ.
Как и можно было предположить, это выражение представляет собой очень приблизите лытую форму проверки корректности адреса электронной почты. Обратите внимание на то, как использован символ обратного слэша (\) для того, чтобы принудить компилятор регулярных выражений к интерпретации предпоследней точки в качестве литерального символа, а не еще одного экземпляра регулярного выражения “любой символ”.
Однако это достаточно примитивный способ проверки корректности адреса электронной почты. Он допускает только буквы алфавита, символ подчеркивания (_), символ минуса (-) и десятичные цифры в части имени, домена и расширения электронного адреса. И здесь должно вступить в игру описание диапазона.
Как упоминалось ранее, все, что находится внутри квадратных скобок, представляет собой набор альтернатив для конкретной символьной позиции. Например, [abc] означает либо а, либо Ь, либо с. Однако если представлять что-либо вроде “любого символа”, включая все возможные варианты в квадратные скобки, это породит абсурдно длинное и сложное регулярное выражение.
К счастью, есть возможность указать “диапазон” символов, разделяя их с помощью тире. Например, [a-z] означает “любой латинский символ нижнего регистра”. Вы можете указать подобным образом более одного диапазона и комбинировать их с индивидуальными символами, размещая их один за другим. Например, наша проверка корректности электронного адреса может быть осуществлена с помощью выражения [A-Za-zO-9_], что приведет все ре!улярное выражение к следующему виду:
[A-Za-zO-9_]+3[A-Za-zO-9J+\.[A-Za-z0-9_]+
Спецификации диапазона, которые мы рассмотрели, являются включающими, то есть они сообщают компилятору регулярных выражений, какие символы могут присутствовать в строке. Иногда более удобно использовать исключающие спецификации, определяющие, что допускаются любые символы, кроме указанных. Это может быть достигнуто включением СИМВОЛЗ ” В спегпафякацию внутри квадратных скобок. Например, ["A-ZJ означает "любой символ, кроме латинских букв верхнего регистра".
Возвращаясь к регулярному выражению проверки адреса электронной почты, мы видим, что оно все еще не настолько хорошо, как могло бы быть. Например, мы знаем, что расширение имени домена должно иметь как минимум два символа (как в . са) и как максимум — четыре (как в .info). Поэтому для обеспечения проверки этого дополнительного требования можно воспользоваться спецификатором задания минимально-максимальной длины, который уже был представлен ранее:
[A-Za-z0-9_]+@[A-Za-zO-9J +\.[A-Za-zO-9J(2,4)
Естественно, вы можете пожелать, чтобы принимались только адреса с трехе и м-вольными расширениями (такими как . com). Этого можно достичь, исключив запятую и параметр птах из спецификатора длины:
[A-Za-z0-9_]+fi[A-Za-z0-9_]+\.[A-Za-z0-9_](3)С другой стороны, если вы котите оставить открытым ограничение максимальной длины, предполагая тот факт, что в будущем могут появиться более длинные расширения доменных имен, можете применить такое регулярное выражение:
(A-Za-zO-9_]+8[A-Za-zO-9J+\. [A-Za-z0-9_] (3, 1
Это означает, что последняя часть выражения может повторяться, минимум, три раза, без ограничения верхнего предела.

Tags: , ,

Related posts

Совместимые регулярные выражения

Perl-совместимые регулярные выражения (Perl Compatible Regular Expressions — PCRE) намного мощнее, чем их POSIX-аналоги. И, следовательно, они более сложны и трудны в применении.
PCRE добавляют свои собственные классы к правилам расширенных регулярных выражений, которые мы видели ранее:
• \w представляет символ “слова” и эквивалентен выражению [A-Za-zQ-9].
• \W является противоположностью \w и эквивалентен выражению [лА-£а-гО-9J, (more…)

Tags: , ,

Related posts

Marco is a programmer

В PCRE существует возможность использовать ссылку, которая была определена ранее в регулярном выражении, как часть самого регулярного выражения. Рассмотрим пример. Предположим, что вы оказались в ситуации, когда требуется проверить следующие выражения:
Marco is a programmer. Marco’s specialty is programming, John is a programmer. John’s specialty is programming.
Имя лица, на которое ссылается предложеЕтие, одинаково в обоих позициях (то есть “Marco” или ‘John”). Применение нормальной операции поиска и замены может потребовать дополнительных усилий при использовании регулярных выражений POSIX, поскольку вы заранее не знаете имени лица. (more…)

Tags: , ,

Related posts

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

Стандарт регулярных выражений PO.SIX, возможно, является наиболее простой формой регулярных выражений, доступных программисту РНР. Именно поэтому он представляет собой отличное учебное пособие, поскольку набор функций, реализованный в нем, не включает никаких “усовершенствованпых” средств.
В дополнение к стандартным правилам, которые мы уже обсудили, стандарт регулярных выражений POSIX определяет концепцию класса символа» как способа еще большего (more…)

Tags: , ,

Related posts

Функций — это pregsplit ()

Следует отметить, что невозможность применения ссылок внутри регулярного выражения является ограничением РИР, а не стандарта POSIX — это, к сожалению, означает, что реализация регулярных выражения РНР не полностью совместима с POSIX.
Основная функция PCRE в РНР — это pregjnatch ():
pregjnatch (pattern, string!, matches[, flags]]);
Как и ereg (), эта функция заставляет проверять иа соответствие регулярному выражению, сохраненному в pattern, строку string, при этом учитывая все совпадения ссылок, переданных в matches. Необязательный параметр flags на данный момент может содержать только (more…)

Tags: , ,

Related posts

Именованные шаблоны

Великолепным и весьма полезным дополнением в PCRE является концепция именованных захватываемых групп (которые чаще называют именованными шаблонами). Такие фуппы позволяют вам обращаться к подшаблонам вашего выражения по произвольному имени вместо обращения но номеру позиции внутри регулярного выражения. Например, рассмотрим следующее регулярное выражение:
/AName=(.+)$/еперь вы должны нормально обращаться к подшаблону (.+) как к первому элементу массива совпадений, возвращенного функцией pregjnatch () (или как $1 в подстановке, выполненной через вызов pregjreplace О либо preg_replace_all ()). (more…)

Tags: , ,

Related posts