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