Отличия от регулярных выражений 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() Нет эквивалента