1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-24 07:42:22 +01:00
Files
archived-doc-ru/reference/pcre/pattern.differences.xml
2024-03-16 22:43:50 +03:00

143 lines
8.2 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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
-->