<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/reference.pcre.pattern.syntax.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'regexp.reference.escape.php',
    1 => 'Экранирующие последовательности',
    2 => 'Экранирующие последовательности',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Синтаксис регулярных выражений',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.meta.php',
    1 => 'Метасимволы',
  ),
  'next' => 
  array (
    0 => 'regexp.reference.unicode.php',
    1 => 'Свойства Unicode-символов',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/pcre/pattern.syntax.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="regexp.reference.escape" class="section">
  <h2 class="title">Экранирующие последовательности</h2>
  <p class="para">
   У обратного слеша «\» несколько назначений. Главное — если обратный слеш
   предшествует небуквенно-цифровому символу, обратный слеш снимает с этого символа
   специальное значение, которое символ мог иметь. Обратный слеш как экранирующий символ
   допустим как в символьном классе, так и вне него.
  </p>
  <p class="para">
   Например, для сопоставления символа «*» в шаблоне указывают «\*».
   Такой подход применяют независимо от того,
   интерпретировал бы парсер символ, который идёт за обратным слешем, как
   специальный без экранирования или нет. Поэтому небуквенно-цифровые символы
   безопасно экранировать символом обратного слеша «\», чтобы указать,
   что символ означает сам себя. Для сопоставления
   обратного слеша с самим собой, записывают «\\».
  </p>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    Обратный слеш в одинарных и двойных <a href="language.types.string.php#language.types.string.syntax" class="link">PHP-строках</a>
    работает как служебный символ. Поэтому когда нужно сопоставить символ \ с регулярным выражением \\,
    в PHP-коде указывают &quot;\\\\&quot; или &#039;\\\\&#039;.
   </p>
  </p></blockquote>
  <p class="para">
   Если указали модификатор
   <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_EXTENDED</a>,
   пробельные символы в шаблоне вне описания символьного класса парсер проигнорирует.
   Также игнорируется часть строки, которая находится между символом «#»,
   который, опять же, не участвует в описании символьного класса,
   и следующим символом перевода строки. В этой ситуации обратный слеш указывают
   как экранирующий символ для обозначения вхождений пробельных символов
   или символа «#» в шаблоне.
  </p>
  <p class="para">
   Второе назначение обратного слеша — кодировать непечатаемые символы в шаблоне в видимой форме.
   Нет ограничений на появление непечатаемых символов, кроме двоичного нуля,
   который завершает шаблон, но при подготовке шаблона в текстовом редакторе
   проще записывать следующие экранирующие последовательности, чем двоичный символ,
   который представляет такую последовательность:
  </p>
  <p class="para">
   <dl>
    
     <dt><em>\a</em></dt>
     <dd>
      <span class="simpara">символ оповещения, сигнал, (BEL, шестнадцатеричный код 07)</span>
     </dd>
    
    
     <dt><em>\cx</em></dt>
     <dd>
      <span class="simpara">«control + x», где x — произвольный символ</span>
     </dd>
    
    
     <dt><em>\e</em></dt>
     <dd>
      <span class="simpara">escape (шестнадцатеричный код 1B)</span>
     </dd>
    
    
     <dt><em>\f</em></dt>
     <dd>
      <span class="simpara">разрыв страницы (шестнадцатеричный код 0C)</span>
     </dd>
    
    
     <dt><em>\n</em></dt>
     <dd>
      <span class="simpara">перевод строки (шестнадцатеричный код 0A)</span>
     </dd>
    
    
     <dt><em>\p{xx}</em></dt>
     <dd>
      <span class="simpara">
       символ со свойством xx, подробнее об этом рассказывает раздел
       «<a href="regexp.reference.unicode.php" class="link">Свойства Unicode-символов</a>»
      </span>
     </dd>
    
    
     <dt><em>\P{xx}</em></dt>
     <dd>
      <span class="simpara">
       символ без свойства xx, подробнее об этом рассказывает раздел
       «<a href="regexp.reference.unicode.php" class="link">Свойства Unicode-символов</a>»
      </span>
     </dd>
    
    
     <dt><em>\r</em></dt>
     <dd>
      <span class="simpara">возврат каретки (шестнадцатеричный код 0D)</span>
     </dd>
    
    
     <dt><em>\R</em></dt>
     <dd>
      <span class="simpara">разрыв строки: совпадает с \n, \r и \r\n</span>
     </dd>
    
    
     <dt><em>\t</em></dt>
     <dd>
      <span class="simpara">табуляция (шестнадцатеричный код 09)</span>
     </dd>
    
    
     <dt><em>\xhh</em></dt>
     <dd>
      <span class="simpara">
       символ с шестнадцатеричным кодом hh
      </span>
     </dd>
    
    
     <dt><em>\ddd</em></dt>
     <dd>
      <span class="simpara">символ с восьмеричным кодом ddd, либо ссылка на подшаблон</span>
     </dd>
    
   </dl>
  </p>
  <p class="para">
   Если быть более точным, комбинация «<code class="literal">\cx</code>» интерпретируется
   следующим образом: если «<code class="literal">x</code>» — символ нижнего регистра,
   он преобразовывается в верхний регистр.
   После этого шестой бит символа (шестнадцатеричный код 40) инвертируется.
   Таким образом, комбинация «<code class="literal">\cz</code>» интерпретируется как шестнадцатеричное
   значение 1A, тогда как комбинация «<code class="literal">\c{</code>» получает шестнадцатеричное
   значение 3B, а «<code class="literal">\c;</code>» — 7B.
  </p>
  <p class="para">
   После комбинации «<code class="literal">\x</code>» считываются ещё две шестнадцатеричные цифры
   в нижнем или верхнем регистре. В <em>режиме UTF-8</em> разрешена запись
   «<code class="literal">\x{...}</code>», где содержимое скобок — строка из шестнадцатеричных цифр.
   Такая запись интерпретируется как символ UTF-8, кодовый номер которого — шестнадцатеричное число.
   Исходная шестнадцатеричная экранирующая последовательность <code class="literal">\xhh</code>
   совпадает с двухбайтовым символом в кодировке UTF-8, если значение шестнадцатеричного числа
   превышает 127.
  </p>
  <p class="para">
   После комбинации «<code class="literal">\0</code>» считываются ещё две восьмеричные цифры.
   Если в записи менее двух цифр, считываются только те, которые указали.
   Таким образом, последовательность «<code class="literal">\0\x\07</code>» будет интерпретирована
   как два двоичных нуля, за которыми следует символ оповещения (звонок). Убедитесь, что
   указали две цифры после начального нуля, если символ, который идёт за нулём, сам
   восьмеричная цифра.
  </p>
  <p class="para">
   Обработка обратного слеша, за которым следует ненулевая цифра, несколько сложнее.
   Вне символьного класса модуль PCRE воспринимает обратный слеш и цифры за ним
   как десятичное число. Если полученное значение меньше десяти
   или если шаблон содержит по меньшей мере такое же количество предшествующих
   текущей позиции подшаблонов, парсер интерпретирует всю конструкцию как
   <em>ссылку на подшаблон</em>.
   Более детальное описание приведём ниже при обсуждении механизма работы подшаблонов.
  </p>
  <p class="para">
   Внутри символьного класса, либо если полученное значение больше 9 и соответствующее
   количество предшествующих подшаблонов отсутствует, модуль PCRE считывает до трёх восьмеричных
   цифр, которые следуют за обратным слешем, и генерирует один байт из последних 8-ми
   значащих битов полученного значения. Все последующие цифры обозначают сами себя. Например:
  </p>
  <p class="para">
   <dl>
    
     <dt><em>\040</em></dt>
     <dd><span class="simpara">ещё один способ записи пробела</span></dd>
    
    
     <dt><em>\40</em></dt>
     <dd>
      <span class="simpara">
       то же самое, если данной записи предшествует менее сорока подшаблонов
      </span>
     </dd>
    
    
     <dt><em>\7</em></dt>
     <dd><span class="simpara">всегда интерпретируется как ссылка на подшаблон</span></dd>
    
    
     <dt><em>\11</em></dt>
     <dd>
      <span class="simpara">
       может быть как обратной ссылкой, так и альтернативной записью символа табуляции
      </span>
     </dd>
    
    
     <dt><em>\011</em></dt>
     <dd><span class="simpara">всегда интерпретируется как символ табуляции</span></dd>
    
    
     <dt><em>\0113</em></dt>
     <dd><span class="simpara">символ табуляции, за которым следует цифра «3»</span></dd>
    
    
     <dt><em>\113</em></dt>
     <dd>
      <span class="simpara">
       интерпретируется как символ с восьмеричным кодом 113 (так как ссылок на подшаблоны не может быть больше 99)
      </span>
     </dd>
    
    
     <dt><em>\377</em></dt>
     <dd><span class="simpara">байт, всецело состоящий из единичных битов</span></dd>
    
    
     <dt><em>\81</em></dt>
     <dd>
      <span class="simpara">
       либо обратная ссылка, либо бинарный ноль, за которым следуют цифры «8» и «1»
      </span>
     </dd>
    
   </dl>
  </p>
  <p class="para">
   Следует помнить, что восьмеричные значения, превышающие 100, следует писать без
   лидирующего нуля, так как читается не более трёх восьмеричных цифр.
  </p>
  <p class="para">
   Все последовательности, определяющие однобайтное значение, могут встречаться
   как внутри, так и вне символьных классов. Кроме того, внутри символьного класса
   запись «<code class="literal">\b</code>» интерпретируется как символ возврата
   («backspace», шестнадцатеричный код 08). Вне символьного класса она имеет
   другое значение (какое именно, описано ниже).
  </p>
  <p class="para">
   Третье использование обратного слеша — указание общего типа символов:
  </p>
  <p class="para">
   <dl>
    
     <dt><em>\d</em></dt>
     <dd><span class="simpara">любая десятичная цифра</span></dd>
    
    
     <dt><em>\D</em></dt>
     <dd><span class="simpara">любой символ, кроме десятичной цифры</span></dd>
    
    
     <dt><em>\h</em></dt>
     <dd><span class="simpara">любой горизонтальный пробельный символ</span></dd>
    
    
     <dt><em>\H</em></dt>
     <dd><span class="simpara">любой символ, не являющийся горизонтальным пробельным символом</span></dd>
    
    
     <dt><em>\s</em></dt>
     <dd><span class="simpara">любой пробельный символ</span></dd>
    
    
     <dt><em>\S</em></dt>
     <dd><span class="simpara">любой непробельный символ</span></dd>
    
    
     <dt><em>\v</em></dt>
     <dd><span class="simpara">любой вертикальный пробельный символ</span></dd>
    
    
     <dt><em>\V</em></dt>
     <dd><span class="simpara">любой символ, не являющийся вертикальным пробельным символом</span></dd>
    
    
     <dt><em>\w</em></dt>
     <dd><span class="simpara">Любой символ, образующий «слово»</span></dd>
    
    
     <dt><em>\W</em></dt>
     <dd><span class="simpara">Любой символ, не образующий «слово»</span></dd>
    
   </dl>
  </p>
  <p class="para">
   Каждая пара таких специальных последовательностей делит полное множество
   всех символов на два непересекающихся множества.
   Любой символ соответствует одному и только одному множеству из пары.
  </p>
  <p class="para">
   Следующие символы считаются «пробельными»: HT (9), LF (10), FF (12), CR (13)
   и пробел (32). Однако, если идёт сопоставление с учётом локали, символы
   с кодовыми точками в диапазоне 128-255 также рассматриваются как пробельные,
   например, символ неразрывного пробела NBSP (A0).
  </p>
  <p class="para">
   Символ, образующий «слово» — это произвольная цифра, буква или символ подчёркивания,
   проще говоря, любой символ, которому разрешено быть частью
   «<em>слова</em>» в Perl. Определение букв и цифр управляется
   символьными таблицами, с которыми собрали модуль PCRE. И, как следствие, эти наборы
   могут отличаться в различных локализированных дистрибутивах.
   Например, в локали «fr» (Франция) ряд символов с кодом выше 128 применяют
   для записи ударных символов и поэтому они соответствуют маске <code class="literal">\w</code>.
  </p>
  <p class="para">
   Описанные типы символов применяют как внутри, так и вне символьных
   классов, и типы соответствуют одному символу данного типа. Если текущая точка
   сравнения находится в конце строки, ни один из них не сможет совпасть, поскольку
   нет символа, с которым могло бы произойти совпадение.
  </p>
  <p class="para">
   Четвёртое назначение обратного слеша — определение некоторых формальных утверждений,
   которые описывают условия месторасположения особых позиций в строке
   и не затрагивают сами символы. Работу с подшаблонами как с более
   сложными формальными утверждениями, документация описывает ниже.
   К такими управляющим последовательностям относятся:
  </p>
  <p class="para">
   <dl>
    
     <dt><em>\b</em></dt>
     <dd><span class="simpara">граница слова</span></dd>
    
    
     <dt><em>\B</em></dt>
     <dd><span class="simpara">не является границей слова</span></dd>
    
    
     <dt><em>\A</em></dt>
     <dd><span class="simpara">начало данных (независимо от многострочного режима)</span></dd>
    
    
     <dt><em>\Z</em></dt>
     <dd>
      <span class="simpara">
       конец данных либо позиция перед последним переводом строки (независимо от многострочного режима)
      </span>
     </dd>
    
    
     <dt><em>\z</em></dt>
     <dd><span class="simpara">конец данных (независимо от многострочного режима)</span></dd>
    
    
     <dt><em>\G</em></dt>
     <dd><span class="simpara">первая совпадающая позиция в строке</span></dd>
    
   </dl>
  </p>
  <p class="para">
   Описанные выше последовательности не могут встречаться в символьных классах
   (исключая комбинацию «<code class="literal">\b</code>», которая внутри класса означает
   символ возврата «backspace»).
  </p>
  <p class="para">
   Границей слова считается такая позиция в строке, в которой из текущего и
   предыдущего символа только один соответствует <code class="literal">\w</code> или
   <code class="literal">\W</code> (т.е. один из них соответствует <code class="literal">\w</code>,
   а другой <code class="literal">\W</code>). Начало или конец строки также соответствуют
   границе слова Если первый или, соответственно, последний символ совпадает
   с <code class="literal">\w</code>.
  </p>
  <p class="para">
   Утверждения <code class="literal">\A</code>, <code class="literal">\Z</code> и <code class="literal">\z</code>
   отличаются от традиционных метасимволов начала и конца строки строки —
   циркумфлекса ^ и знака доллара $, которые описывает раздел
   «<a href="regexp.reference.anchors.php" class="link">Якоря</a>»,
   тем, что они всегда совпадают только в самом начале и конце входной строки,
   какие бы параметры ни установили.
   На них никак не влияют опции
   <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_MULTILINE</a> и
   <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOLLAR_ENDONLY</a>.
   Разница между <code class="literal">\Z</code> и <code class="literal">\z</code> в том,
   что <code class="literal">\Z</code> соответствует позиции перед последним символом,
   если последний символ — перевод строки, кроме самого конца строки.
   Тогда как <code class="literal">\z</code> соответствует исключительно концу данных.
  </p>
  <p class="para">
   Утверждение <code class="literal">\G</code> будет истинным, только если
   текущая проверяемая позиция находится в начале совпадения, которое указали
   в параметре <code class="parameter">offset</code> функции <span class="function"><a href="function.preg-match.php" class="function">preg_match()</a></span>.
   Она отличается от последовательности <code class="literal">\A</code> при ненулевом значении
   параметра <code class="parameter">offset</code>.
  </p>

  <p class="para">
   Последовательности <code class="literal">\Q</code> и <code class="literal">\E</code>
   игнорируют метасимволы регулярного выражения в шаблоне. Например:
   шаблон <code class="literal">\w+\Q.$.\E$</code> совпадёт с «заякоренными»
   в конце строки одним или более символами слова, за которыми следуют
   литералы <code class="literal">.$.</code>. Обратите внимание, что это не меняет поведение
   разделителей; например, шаблон <code class="literal">#\Q#\E#$</code>
   неправильный, потому что второй символ <code class="literal">#</code> отмечает конец шаблона,
   а последовательность <code class="literal">\E#</code> парсер интерпретирует как недопустимые модификаторы.
  </p>

  <p class="para">
   Последовательность <code class="literal">\K</code> сбрасывает начало совпадения. Например,
   шаблон <code class="literal">foo\Kbar</code> совпадёт со значением «foobar», но сообщит,
   что совпал только с «bar». Последовательность
   <code class="literal">\K</code> не мешает установке подшаблонов. Например, если шаблон
   <code class="literal">(foo)\Kbar</code> совпадёт со строкой «foobar», первым подшаблоном
   всё равно будет значение «foo».
  </p>

 </div><?php manual_footer($setup); ?>