PHP Відмінності від Perl

Наведені тут відмінності відносяться до версії Perl 5.005.

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

PCRE надає деякі розширення регулярних виразів Perl:

  1. Незважаючи на те, що випереджаючі припущення повинні розпізнавати рядки фіксованої довжини, кожне альтернативне ретроспективне припущення може розпізнавати рядки різної довжини. Perl 5.005 вимагає, щоб вони були однією довжиною.
  2. Якщо встановлена ​​PCRE_DOLLAR_ENDONLY і не встановлена ​​PCRE_MULTILINE, метасимвол $ розпізнається лише наприкінці рядка.
  3. Якщо встановлено PCRE_EXTRA, зворотний сліш із наступною за ним літерою, що не має спеціального значення, призводить до помилки.
  4. Якщо встановлено PCRE_UNGREEDY, жадібність квантифікаторів повторенняінвертована. Тобто за умовчанням вони не жадібні, поки за ними не буде питання.