mirror of
https://github.com/php/doc-ru.git
synced 2026-03-24 07:42:22 +01:00
143 lines
8.2 KiB
XML
143 lines
8.2 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: 96c9d88bad9a7d7d44bfb7f26c226df7ee9ddf26 Maintainer: rjhdby Status: ready -->
|
||
<!-- Reviewed: no -->
|
||
<article xml:id="reference.pcre.pattern.differences" xmlns="http://docbook.org/ns/docbook">
|
||
<title>Отличия от Perl</title>
|
||
<titleabbrev>Отличия от Perl</titleabbrev>
|
||
<para>
|
||
Описанные здесь отличия относятся к версии Perl 5.005.
|
||
<orderedlist>
|
||
<listitem>
|
||
<simpara>
|
||
По умолчанию пробельный символ — любой символ, который функция isspace()
|
||
из библиотеки C опознает таковым, хотя возможно скомпилировать PCRE с альтернативными
|
||
таблицами символов. Функция isspace() определяет как пробельный следующие символы:
|
||
пробел, конец страницы (formfeed), перевод строки, возврат каретки, горизонтальную
|
||
табуляцию и вертикальную табуляцию. Perl 5 же не включает вертикальную табуляцию в
|
||
список пробельных символов. Экранирование \v долгое время присутствовавшее в
|
||
документации Perl на самом деле никогда не распознавалось. Однако, символ как таковой,
|
||
считался за пробельный до версии 5.002. В 5.004 и 5.005 он не определяется как \s.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
PCRE не позволяет использовать квантификаторы повторения в опережающих
|
||
предположениях. Perl разрешает, но они не означают того, о чем вы могли подумать. К
|
||
примеру, (?!a){3} не проверяет, что следующие три символа не "a". Проверяется только то,
|
||
что следующий символ не "a" три раза.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Захватывающие подшаблоны, которые возникают в отрицательных опережающих проверках
|
||
считаются, но их записи в векторе смещений никогда не устанавливаются. Perl
|
||
устанавливает числовые переменные из любых подобных масок, которые совпали до
|
||
момента, когда предположение не подтвердилось при проверке чего-либо, но только если
|
||
опережающее предположение содержит только одну ветвь.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Хотя бинарные нулевые символы поддерживаются в проверяемой строке, они недопустимы
|
||
в строке шаблона, потому что она передаётся как нормальная C-строка, в которой этот
|
||
символ обозначает конец строки. Для его использования в строке шаблона необходимо
|
||
пользоваться конструкцией "\x00".
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Следующие экранирующие последовательности Perl не поддерживаются:
|
||
\l, \u, \L, \U. Фактически они реализованы стандартным обработчиком строк Perl и
|
||
не являются частью модуля обработки регулярных выражений.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Предположение \G из Perl также не поддерживается, поскольку не имеет отношения к
|
||
отдельно взятой схеме совпадений.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Довольно очевидно, что PCRE не поддерживает конструкции (?{code}) и (??{code}).
|
||
Тем не менее, есть поддержка рекурсивных шаблонов.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Есть ещё странный момент при в Perl 5.005_02, связанный с установкой захваченных строк,
|
||
когда часть шаблона повторяется. К примеру, проверка "aba" шаблоном /^(a(b)?)+$/,
|
||
устанавливает $2 в значение "b", но проверка "aabbaa" шаблоном /^(aa(bb)?)+$/,
|
||
оставляет $2 не выставленной. Хотя, если шаблон поменять на /^(aa(b(b))?)+$/, то $2
|
||
(и $3) будут установлены. В Perl 5.004, $2 установится в обоих случаях, и это также
|
||
истинно и для PCRE. Если в будущем Perl как-либо зафиксирует это поведение, PRCE
|
||
будет ему следовать.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Другое до сих пор неразрешённое противоречие в том, что Perl 5.005_02, шаблоном
|
||
/^(a)?(?(1)a|b)+$/ распознает строку "a", а PCRE нет. Хотя и в Perl и в PCRE, /^(a)?a/
|
||
распознает "a" и оставляет $1 не выставленной.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
PCRE предоставляет некоторые расширения регулярных выражений Perl:
|
||
<orderedlist>
|
||
<listitem>
|
||
<simpara>
|
||
Несмотря на то, что опережающие предположения должны распознавать строки
|
||
фиксированной длины, каждое альтернативное ретроспективное предположение
|
||
может распознавать строки разной длины. Perl 5.005 требует, чтобы они были одной
|
||
длины.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Если установлена <link linkend="reference.pcre.pattern.modifiers">PCRE_DOLLAR_ENDONLY</link>
|
||
и не установлена <link linkend="reference.pcre.pattern.modifiers">PCRE_MULTILINE</link>,
|
||
метасимвол $ распознается только в самом конце строки.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Если установлена <link linkend="reference.pcre.pattern.modifiers">PCRE_EXTRA</link>,
|
||
обратный слеш с последующей за ним буквой, не имеющий специального значения,
|
||
приводит к ошибке.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Если установлена <link linkend="reference.pcre.pattern.modifiers">PCRE_UNGREEDY</link>,
|
||
жадность квантификаторов повторения инвертирована. То есть по умолчанию они не
|
||
жадные, пока за ними не будет знак вопроса.
|
||
</simpara>
|
||
</listitem>
|
||
</orderedlist>
|
||
</para>
|
||
</listitem>
|
||
</orderedlist>
|
||
</para>
|
||
</article>
|
||
<!-- Keep this comment at the end of the file
|
||
Local variables:
|
||
mode: sgml
|
||
sgml-omittag:t
|
||
sgml-shorttag:t
|
||
sgml-minimize-attributes:nil
|
||
sgml-always-quote-attributes:t
|
||
sgml-indent-step:1
|
||
sgml-indent-data:t
|
||
indent-tabs-mode:nil
|
||
sgml-parent-document:nil
|
||
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
||
sgml-exposed-tags:nil
|
||
sgml-local-catalogs:nil
|
||
sgml-local-ecat-files:nil
|
||
End:
|
||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||
vim: et tw=78 syn=sgml
|
||
vi: ts=1 sw=1
|
||
-->
|