PHP Відмінності від Perl
Наведені тут відмінності відносяться до версії Perl 5.005.
- За промовчанням пробіловий символ - це будь-який символ, який функція isspace() з бібліотеки C упізнає таким, хоча можливо скомпілювати PCRE з альтернативними таблицями символів. Функція isspace() визначає як пробіловий такі символи: пробіл, кінець сторінки (formfeed), переклад рядка, повернення каретки, горизонтальну табуляцію та вертикальну табуляцію. Perl 5 не включає вертикальну табуляцію в список пробілових символів. Екранування \v довгий час присутнє в документації Perl насправді ніколи не розпізнавалася. Однак, символ як такий, вважався за пробільний до версії 5002. У 5.004 та 5.005 він не визначається як \s.
- PCRE не дозволяє використовувати квантифікатори повторення в випереджальних припущеннях. Perl дозволяє, але вони не означають, про що ви могли подумати. Наприклад, (?!a) не перевіряє, що три символи не "a". Перевіряється лише те, що наступний символ не тричі.
- Захоплюючі підшаблони, які виникають у негативних випереджальних перевірках, вважаються, але їх записи у векторі зсувів ніколи не встановлюються. Perl встановлює числові змінні з будь-яких подібних масок, які збіглися до моменту, коли припущення не підтвердилося під час перевірки чогось, але тільки якщо випереджаюче припущення містить лише одну гілка.
- Хоча бінарні нульові символи підтримуються в рядку, що перевіряється, вони неприпустимі в рядку шаблону, тому що вона передається як нормальна C-рядок, в якій цей символ позначає кінець рядка. Для його використання в рядку шаблону необхідно скористатися конструкцією "x00".
- Наступні екрануючі послідовності Perl не підтримуються: \l, \u, \L, \U.Фактично вони реалізовані стандартним обробником рядків Perl і є частиною модуля обробки регулярних виразів.
- Припущення \G із Perl також не підтримується, оскільки не має відношення до окремо взятої схеми збігів.
- Очевидно, що PCRE не підтримує конструкції (?) і (??). Проте є підтримка рекурсивних шаблонів.
- Є ще дивний момент при 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 буде слідувати йому.
- Інша досі невирішена суперечність у тому, що Perl 5.005_02 шаблоном /^(a)?(?(1)ab)+$/ розпізнає рядок "a", а PCRE немає. Хоча і в Perl і PCRE, /^(a)?a/ розпізнає "a" і залишає $1 не виставленої.
PCRE надає деякі розширення регулярних виразів Perl:
- Незважаючи на те, що випереджаючі припущення повинні розпізнавати рядки фіксованої довжини, кожне альтернативне ретроспективне припущення може розпізнавати рядки різної довжини. Perl 5.005 вимагає, щоб вони були однією довжиною.
- Якщо встановлена PCRE_DOLLAR_ENDONLY і не встановлена PCRE_MULTILINE, метасимвол $ розпізнається лише наприкінці рядка.
- Якщо встановлено PCRE_EXTRA, зворотний сліш із наступною за ним літерою, що не має спеціального значення, призводить до помилки.
- Якщо встановлено PCRE_UNGREEDY, жадібність квантифікаторів повторенняінвертована. Тобто за умовчанням вони не жадібні, поки за ними не буде питання.