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