РНР 5 в подлиннике

Страница 232 из 554


Гпава 24. Основы регулярных выражений в формате PCRE

469

Группировка без захвата

Каждый участок строки, соответствующий кусочку выражения, обрамленному круглыми скобками, в итоге попадает в тот или иной карман. В большинстве случаев мы на это и рассчитываем. Однако случаются ситуации, когда скобки используются только для описания повторяющихся конструкций, и нет никакой необходимости записывать что-то в карманы.

К таким ситуациям, например, практически всегда относится конструкция

(подвыражение) *

Здесь скобки используются только для того, чтобы "применить" звездочку не к одному последнему символу, а к целому подвыражению. В карман в этом случае попадет лишь последнее совпадение. Для того чтобы записать в карман весь совпавший текст, нам придется написать:

((подвыражение)*)

Но ведь тогда получится уже два кармана, а не один...

Решение — применение "несохраняющих" скобок. С их использованием последний пример может быть переписан так:

( (?:подвыражение) *)

Внимание!

Рассматривайте (?: как один неделимый символ.

Вот теперь создастся один-единственный карман, в который и будет помещено все совпадение, "накрученное" звездочкой.

На самом деле, такой способ даже несколько увеличивает быстродействие анализатора регулярных выражений: теперь ему нет необходимости выполнять лишнюю операцию копирования строк.

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

Как мы знаем, любое регулярное выражение в формате PCRE должно быть обрамлено символами-ограничителями. (Чаще всего для этого используются слэши.) После последнего ограничителя могут идти несколько так называемых модификаторов, предназначенных для уточнения действия регулярного выражения.

Модификатор//: игнорирование регистра

Как мы уже неоднократно говорили, выражение /выражение/i совпадает безотносительно к регистру символов в целевой строке. При этом автоматически учитывают настройки локали (см. функцию setlocale о в гл. 15). А значит, при верно указанном имени локали спецсимволы \w, \ь, конструкция [[:aipha:]] и т. д. корректно работают с русскими буквами. Например, выражение [ [:alpha:] ]+ удовлетворяет любому слову как на английском, так и на русском языке.

При сопоставлении регулярного выражения со строкой в карманы попадает совпавший участок строки, независимо от того, указан ли модификатор /± или нет. На-

470

Часть IV. Стандартные функции РНР

пример, при поиске по выражению /(a+)/i в строке "ВАаВ" в первом кармане окажется "Аа", а не "аа".

Модификатор/х: пропуск пробелов и комментариев

Данный модификатор мы также уже затрагивали. Он позволяет писать регулярные выражения в более изящном, читабельном виде. Допускается вставлять в выражение пробельные символы (в том числе перевод строки), а также однострочные комментарии, предваренные решеткой (#).

Пример регулярного выражения с модификатором /х:

$ге = '(

\[(\w+)\] # открывающий тег

(.*?) # минимум любых символов

\[/\1\] # и закрывающий тег, парный открывающему }ixs',•

Модификатор /т: многострочность

До сих пор мы не обращали особого внимания на тот факт, что в переменных могут содержаться "многострочные" строки — величины, содержащие символы перевода строки. Мы подразумевали, что регулярное выражение сопоставляется со всей строкой целиком, и символ Л совпадает с началом строки, а символ $ — с ее концом. Такое поведение не всегда оказывается удобным и, более того, оно даже не всегда действует "по умолчанию".

Рассмотрим ситуацию, когда нам нужно добавить знак табуляции в каждой строке некоторой "многострочной" переменной. Листинг 24.11 иллюстрирует, как это сделать.

! Листинг 24.11. Файл ех9.php

<?php ## Многострочность.

$str = file_get_contents(_FILE_);

$str = preg_replace('/л/т', "\t", $str); echo "<pre>".htmlspecialchars($str)."</pre>"; ?>

Обратите внимание на использование модификатора /т: регулярное выражение 1 /~/т' теперь совпадает с началом каждой внутренней строки переменной $str. Мы заменяем "начало строки" на символ табуляции — фактически, заменяем 0 символов на 1 (вспомните, что Л обозначает позицию между двумя знакоместами).

Как видно, модификатор /т заставляет некоторые управляющие символы вести себя по-другому. Приведем полный список изменившихся ролей.

□ Мнимый символ Л теперь соответствует началу каждой внутренней подстроки в сопоставляемой переменной.

□ Мнимый символ $ совпадает с позицией перед символом \п, а также с концом строки.




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006