Ожидаемая продолжительность жизни эрега, мигрирующих в прег - PullRequest
8 голосов
/ 03 мая 2011

Я работаю над большим приложением PHP (> 1 миллион строк, возраст 10 лет), в котором широко используются ereg и ereg_replace - в настоящее время 1768 уникальных регулярных выражений в 516 классах.

I 'Я прекрасно понимаю, почему ereg устарела, но явно мигрирует на preg.

Кто-нибудь знает, как долго поддержка ereg будет поддерживаться в PHP, и / или есть какие-либо рекомендации по переходу на preg в таком масштабе.Я подозреваю, что автоматический перевод с ereg на preg невозможен / нецелесообразен?

Ответы [ 4 ]

2 голосов
/ 03 мая 2011

Моя интуиция говорит, что они никогда не собираются удалять ereg специально.PHP по-прежнему поддерживает очень старые и устаревшие вещи, такие как глобальные регистры.Там просто слишком много устаревших приложений.Однако есть небольшая вероятность того, что расширение будет удалено, потому что кто-то находит серьезную уязвимость, и просто некому ее исправить.

В любом случае, стоит отметить, что:

  1. Вы не обязаны обновлять установку PHP.Обычно устаревшие серверы используются для запуска устаревших приложений.

  2. Пакет PHP_Compat PEAR предлагает простую PHP-версию некоторых собственных функций.Если ereg исчезнет, ​​возможно, его добавят.


Кстати ... На самом деле, PHP 6 мертв .Они поняли, что их подход сделать PHP полностью совместимым с Юникодом было сложнее, чем они думали, и они все переосмысливают.Вывод таков: никогда нельзя делать совершенных предсказаний.

2 голосов
/ 03 мая 2011

Я не уверен, когда ereg будет удалено, но моя ставка на PHP 6.0.

Что касается вашей второй проблемы (перевод ereg на preg), то это не кажется чем-то сложным, если в вашем приложении более 1 миллиона строк, то, конечно, у вас должны быть ресурсы, чтобы кто-то выполнял эту работу максимум неделю. , Я бы собрал все экземпляры ereg_ в вашем коде и настроил бы некоторые макросы в вашей любимой IDE (такие простые вещи, как добавление разделителей, модификаторов и т. Д.).

Могу поспорить, что большинство из 1768 регулярных выражений можно портировать с помощью макроса, а остальные, ну, в общем, с хорошей парой глаз.

Другой вариант может заключаться в написании оболочек для функций ereg, если они недоступны, реализуя изменения при необходимости:

if (function_exists('ereg') !== true)
{
    function ereg($pattern, $string, &$regs)
    {
        return preg_match('~' . addcslashes($pattern, '~') . '~', $string, $regs);
    }
}

if (function_exists('eregi') !== true)
{
    function eregi($pattern, $string, &$regs)
    {
        return preg_match('~' . addcslashes($pattern, '~') . '~i', $string, $regs);
    }
}

Вы поняли идею. Кроме того, PEAR-пакет PHP Compat также может быть приемлемым решением.


Отличия от POSIX regex

Начиная с PHP 5.3.0, POSIX Regex продление не рекомендуется. Есть количество различий между POSIX регулярное выражение и регулярное выражение PCRE. Эта страница списков самые известные из них, которые необходимо знать при конвертации в PCRE.

  1. Функции PCRE требуют, чтобы шаблон был заключен в разделители.
  2. В отличие от POSIX, расширение PCRE не имеет специальных функций для сопоставление без учета регистра. Вместо, это поддерживается с помощью шаблона / I модификатор. Другие модификаторы также доступны для изменения стратегия соответствия.
  3. Функции POSIX находят самое длинное из самых левых совпадений, но PCRE останавливается на первом действительном совпадении. Если строка не совпадает вообще не имеет значения, но если это соответствует это может иметь драматическое влияние как на результирующее совпадение и совпадение скорость. Чтобы проиллюстрировать эту разницу, рассмотрим следующий пример из «Освоение регулярных выражений» Джеффри Фридл Используя образец один (сам)? (самодостаточный)? на самодостаточность с помощью PCRE приведет к сопоставлению себя, но используя POSIX, результат будет полная строка сама по себе достаточна. И то и другое (под) строки соответствуют оригиналу строка, но POSIX требует, чтобы Дольше всего будет результат.
1 голос
/ 03 мая 2011

У меня была эта проблема в гораздо меньшем масштабе - приложение, больше похожее на 10000 строк. В любом случае все, что мне нужно сделать, это переключиться на preg_replace() и поместить разделители вокруг шаблона регулярного выражения.

Любой должен иметь возможность сделать это - даже непрограммист может получить список имен файлов и номеров строк.

Затем просто запустите свои тесты, чтобы увидеть возможные сбои, которые можно исправить.

ereg функции будут удалены из PHP6, кстати - http://jero.net/articles/php6.

0 голосов
/ 03 мая 2011

Все функции ereg будут удалены с PHP 6, я полагаю.

...