<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/pcre.pattern.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'reference.pcre.pattern.differences.php',
    1 => 'Отличия от Perl',
    2 => 'Отличия от Perl',
  ),
  'up' => 
  array (
    0 => 'pcre.pattern.php',
    1 => 'Регулярные PCRE-выражения',
  ),
  'prev' => 
  array (
    0 => 'reference.pcre.pattern.modifiers.php',
    1 => 'Модификаторы шаблонов',
  ),
  'next' => 
  array (
    0 => 'ref.pcre.php',
    1 => 'Функции PCRE',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/pcre/pattern.differences.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="reference.pcre.pattern.differences" class="article">
 <h1 class="title">Отличия от Perl</h1>

 
 <p class="para">
  Описанные здесь отличия относятся к версии Perl 5.005.
  <ol type="1">
   <li class="listitem">
    <span class="simpara">
     По умолчанию пробельный символ — любой символ, который функция isspace()
     из библиотеки C опознает таковым, хотя возможно скомпилировать PCRE с альтернативными
     таблицами символов. Функция isspace() определяет как пробельный следующие символы:
     пробел, конец страницы (formfeed), перевод строки, возврат каретки, горизонтальную
     табуляцию и вертикальную табуляцию. Perl 5 же не включает вертикальную табуляцию в
     список пробельных символов. Экранирование \v долгое время присутствовавшее в
     документации Perl на самом деле никогда не распознавалось. Однако, символ как таковой,
     считался за пробельный до версии 5.002. В 5.004 и 5.005 он не определяется как \s.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     PCRE не позволяет использовать квантификаторы повторения в опережающих
     предположениях. Perl разрешает, но они не означают того, о чем вы могли подумать. К
     примеру, (?!a){3} не проверяет, что следующие три символа не &quot;a&quot;. Проверяется только то,
     что следующий символ не &quot;a&quot; три раза.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Захватывающие подшаблоны, которые возникают в отрицательных опережающих проверках
     считаются, но их записи в векторе смещений никогда не устанавливаются. Perl
     устанавливает числовые переменные из любых подобных масок, которые совпали до
     момента, когда предположение не подтвердилось при проверке чего-либо, но только если
     опережающее предположение содержит только одну ветвь.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Хотя бинарные нулевые символы поддерживаются в проверяемой строке, они недопустимы
     в строке шаблона, потому что она передаётся как нормальная C-строка, в которой этот
     символ обозначает конец строки. Для его использования в строке шаблона необходимо
     пользоваться конструкцией &quot;\x00&quot;.
    </span>
    </li>
    <li class="listitem">
    <span class="simpara">
     Следующие экранирующие последовательности Perl не поддерживаются:
     \l,  \u,  \L,  \U. Фактически они реализованы стандартным обработчиком строк Perl и
     не являются частью модуля обработки регулярных выражений.
    </span>
    </li>
    <li class="listitem">
    <span class="simpara">
     Предположение \G из Perl также не поддерживается, поскольку не имеет отношения к
     отдельно взятой схеме совпадений.
    </span>
    </li>
    <li class="listitem">
    <span class="simpara">
     Довольно очевидно, что PCRE не поддерживает конструкции  (?{code}) и (??{code}).
     Тем не менее, есть поддержка рекурсивных шаблонов.
    </span>
    </li>
    <li class="listitem">
    <span class="simpara">
     Есть ещё странный момент при в Perl 5.005_02, связанный с установкой захваченных строк,
     когда часть шаблона повторяется. К примеру, проверка &quot;aba&quot;  шаблоном /^(a(b)?)+$/,
     устанавливает $2 в значение &quot;b&quot;, но проверка &quot;aabbaa&quot; шаблоном /^(aa(bb)?)+$/,
     оставляет $2 не выставленной. Хотя, если шаблон поменять на /^(aa(b(b))?)+$/, то $2
     (и $3) будут установлены. В Perl 5.004, $2 установится в обоих случаях, и это также
     истинно и для PCRE. Если в будущем Perl как-либо зафиксирует это поведение, PRCE
     будет ему следовать.
    </span>
    </li>
    <li class="listitem">
    <span class="simpara">
     Другое до сих пор неразрешённое противоречие в том, что Perl 5.005_02, шаблоном
     /^(a)?(?(1)a|b)+$/ распознает строку &quot;a&quot;, а PCRE нет. Хотя и в Perl и в PCRE, /^(a)?a/
     распознает &quot;a&quot; и оставляет $1 не выставленной.
    </span>
    </li>
    <li class="listitem">
    <p class="para">
     PCRE предоставляет некоторые расширения регулярных выражений Perl:
      <ol type="1">
       <li class="listitem">
        <span class="simpara">
         Несмотря на то, что опережающие предположения должны распознавать строки
         фиксированной длины, каждое альтернативное ретроспективное предположение
         может распознавать строки разной длины. Perl 5.005 требует, чтобы они были одной
         длины.
       </span>
      </li>
      <li class="listitem">
       <span class="simpara">
        Если установлена <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOLLAR_ENDONLY</a>
        и не установлена <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_MULTILINE</a>,
        метасимвол $ распознается только в самом конце строки.
       </span>
      </li>
      <li class="listitem">
       <span class="simpara">
        Если установлена <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_EXTRA</a>,
        обратный слеш с последующей за ним буквой, не имеющий специального значения,
        приводит к ошибке.
       </span>
      </li>
      <li class="listitem">
       <span class="simpara">
        Если установлена  <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_UNGREEDY</a>,
        жадность квантификаторов повторения инвертирована. То есть по умолчанию они не
        жадные, пока за ними не будет знак вопроса.
       </span>
      </li>
     </ol>
    </p>
   </li>
  </ol>
 </p>
</div>
<?php manual_footer($setup); ?>