Отличия от регулярных выражений 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 рассматривается как попытка использования одной из этих неподдерживаемых функций и вызывает ошибку компиляции.
POSIX | PCRE |
---|---|
ereg_replace() | preg_replace() |
ereg() | preg_match() |
eregi_replace() | preg_replace() |
eregi() | preg_match() |
split() | preg_split() |
spliti() | preg_split() |
sql_regcase() | Нет эквивалента |