РНР 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 (вспомните, что Л обозначает позицию между двумя знакоместами). Как видно, модификатор /т заставляет некоторые управляющие символы вести себя по-другому. Приведем полный список изменившихся ролей. □ Мнимый символ Л теперь соответствует началу каждой внутренней подстроки в сопоставляемой переменной. □ Мнимый символ $ совпадает с позицией перед символом \п, а также с концом строки. |
| |
|
В начало ←предыдущая следующая→ ... 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 ... | ||