PHP Velho Oeste 2024

Отличия от регулярных выражений POSIX

По состоянию на PHP 5.3.0 расширение регулярных выражений POSIX‎ считается устаревшим. Существует целый ряд отличий между регулярными выражениями POSIX и PCRE. На этой странице перечислены наиболее важные из них, которые необходимо знать для того, чтобы выполнить преобразование в PCRE.

  1. Функции PCRE требуют, чтобы шаблон был заключен в разделители.
  2. В отличие от POSIX, в расширении PCRE нет специальных функций для поиска совпадений без учета регистра. Вместо них используется модификатор шаблона i (PCRE_CASELESS). Также доступны другие модификаторы шаблонов для изменения стратегии поиска совпадений.
  3. Функции POSIX находят самое длинное совпадение, ближнее к левому краю, а PCRE останавливается с первым найденным совпадением. Если строка не совпадает вовсе, это не имеет значения, в противном случае это может оказать существенное влияние и на результаты поиска совпадений, и на скорость этого поиска. Чтобы проиллюстрировать эту разницу, рассмотрим следующий пример из книги Джеффри Фридла "Регулярные выражения" (Jeffrey Friedl, "Mastering Regular Expressions"). При применении шаблона one(self)?(selfsufficient)? к строке oneselfsufficient, PCRE вернет oneself, но при использовании POSIX результатом будет вся строка oneselfsufficient. Обе (под)строки соответствуют исходному шаблону, но POSIX требует, чтобы наиболее длинная вернулась в качестве результата.
  4. Определение "символьного класса" в POSIX отличается от PCRE. Простые выражения в квадратных скобках, для нахождения определенных символов поддерживается в символьных классах PCRE, а сопоставления элементов, символьные классы и символьные эквиваленты POSIX не поддерживаются. Передача выражения с символьным классом, начинающегося и заканчивающегося на символы :, . или =, в PCRE рассматривается как попытка использования одной из этих неподдерживаемых функций и вызывает ошибку компиляции.

Замены для функций
POSIX PCRE
ereg_replace() preg_replace()
ereg() preg_match()
eregi_replace() preg_replace()
eregi() preg_match()
split() preg_split()
spliti() preg_split()
sql_regcase() Нет эквивалента

add a note add a note

User Contributed Notes 2 notes

up
1
cdragon at dracoventions dot com
10 years ago
In regards to the previous comment that says "there are several other differences including different meaning for the symbols  ( [ different rules for which symbols need escaping", as far as I can tell from reading
http://www.tin.org/bin/man.cgi?section=7&topic=regex
there are absolutely no "other differences" except in what the man page calls "Obsolete  ("basic'')  regular  expressions".  However, PHP doesn't appear to use the obsolete form of expressions in its POSIX functions.

PCRE even supports all of the POSIX named character classes such as [:space:].
up
0
jasen at treshna dot com
12 years ago
there are several other differences

including different meaning for the symbols  ( [
different rules for which symbols need escaping (they can't be the same as both standard posix and extended posix)

you should read the full documentation for PCRE before chaging any posix regex to use pcre.
To Top