<?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.assertions.php',
    1 => 'Утверждения',
    2 => 'Утверждения',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Синтаксис регулярных выражений',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.back-references.php',
    1 => 'Обратные ссылки',
  ),
  'next' => 
  array (
    0 => 'regexp.reference.onlyonce.php',
    1 => 'Однократные подшаблоны',
  ),
  '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.assertions" class="section">
  <h2 class="title">Утверждения</h2>
  <p class="para">
   Утверждения — проверка символов, которые идут до или после текущей позиции
   сопоставления, которая фактически не включает никаких символов (символы входной
   строки не сопоставляются с утверждениями). Наиболее простые варианты утверждений,
   например \b, \B, \A, \Z, \z, ^ и $, рассматривает раздел
   «<a href="regexp.reference.escape.php" class="link">Экранирующие последовательности</a>».
   Более сложные утверждения записываются как подшаблоны. Утверждения
   бывают двух видов: те, которые анализируют текст, следующий
   <em>после текущей позиции</em> (look ahead),
   и идущий <em>перед ней</em> (look behind).
  </p>
  <p class="para">
   Сопоставление подшаблонов, которые содержат утверждение, выполняют обычным
   образом, за исключением того, что текущая позиция не изменяется.
   Утверждения касательно <em>последующего текста</em>
   начинаются с (?= для положительных утверждений и с (?! для отрицающих
   утверждений. Например,

   <code class="literal">\w+(?=;)</code>

   совпадает со словом, за которым следует символ «;», но при этом сама
   точка с запятой в совпадение не включается. А

   <code class="literal">foo(?!bar)</code>

   соответствует любому появлению «foo», после которого не идёт «bar».
   Заметим, что похожий шаблон

   <code class="literal">(?!foo)bar</code>

   не будет искать вхождение «bar», которому предшествует любая
   строка за исключением «foo». Но, тем не менее, он будет соответствовать
   любым вхождениям подстроки «bar», поскольку условие (?!foo) всегда
   <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, если следующие три символа — «bar». Для получения желаемого
   результата необходимо воспользоваться второй категорией утверждений.
  </p>
  <p class="para">
   Утверждения касательно <em>предшествующего текста</em>
   начинаются с (?&lt;= для положительных утверждений и (?&lt;!
   для отрицающих. Например,

   <code class="literal">(?&lt;!foo)bar</code>

   найдёт вхождения «bar», которым не предшествует «foo». Сами
   утверждения «назад» ограничены так, чтобы все подстроки, которым
   они соответствуют, имели фиксированную длину. Но, Если
   используются несколько альтернатив, они не обязаны иметь одинаковую
   длину. Таким образом шаблон

   <code class="literal">(?&lt;=bullock|donkey)</code>

   корректен, но

   <code class="literal">(?&lt;!dogs?|cats?)</code>

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

   <code class="literal">(?&lt;=ab(c|de))</code>

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

   <code class="literal">(?&lt;=abc|abde)</code>

   Утверждения касательно предшествующего текста реализованы так,
   что для каждой альтернативы текущая позиция временно переносится
   назад, на фиксированную ширину, после чего выполняется поиск
   соответствия условию. Если перед текущей позицией недостаточно
   символов, поиск соответствия терпит неудачу. Утверждения назад в сочетании
   с однократными подшаблонами удобны для поиска
   в конце строки; соответствующий пример приведён в конце раздела
   «Однократные подшаблоны».
  </p>
  <p class="para">
   Несколько утверждений (разных типов) могут присутствовать в
   утверждении, например:

   <code class="literal">(?&lt;=\d{3})(?&lt;!999)foo</code>

   совпадает с подстрокой «foo», которой предшествуют три цифры,
   отличные от «999». Следует понимать, что каждое из утверждений
   проверяется относительно одной и той же позиции в обрабатываемом
   тексте. Вначале выполняется проверка того, что предшествующие три символа —
   это цифры, затем проверяется, чтобы эти же цифры не являлись
   числом 999. Приведённый выше шаблон не соответствует подстроке
   «foo», которой предшествуют шесть символов, первые три из которых —
   цифры, а последние три не образуют «999». Например, он не
   соответствует строке «123abcfoo», в то время как шаблон

   <code class="literal">(?&lt;=\d{3}...)(?&lt;!999)foo</code>
   соответствует.
  </p>
  <p class="para">
   В этом случае анализируются предшествующие шесть
   символов на предмет того, чтобы первые три из них были цифрами,
   а последние три не образовали «999».
  </p>
  <p class="para">
   Утверждения могут быть вложенными, причём в произвольных сочетаниях:

   <code class="literal">(?&lt;=(?&lt;!foo)bar)baz</code>

   соответствует подстроке «baz», которой предшествует «bar»,
   перед которой, в свою очередь, нет «foo», а

   <code class="literal">(?&lt;=\d{3}...(?&lt;!999))foo</code> —

   совершенно другой шаблон, соответствующий подстроке «foo»,
   которой предшествуют три цифры и три произвольных символа, отличных
   от «999».
  </p>
  <p class="para">
   Утверждающие подшаблоны — незахватывающие и неповторяемые,
   поскольку бессмысленно повторять одно и то же несколько раз. Если
   в утверждении произвольного типа находится захватывающий подшаблон,
   он нумеруется в той же последовательности, что и все остальные
   захватывающие подшаблоны, но захват соответствующих значений происходит
   только для положительных утверждений, поскольку для отрицающих это не
   имеет смысла.
  </p>
  <p class="para">
   В утверждениях обрабатывается не более 200 захватывающих подшаблонов.
  </p>
 </div><?php manual_footer($setup); ?>