Как я могу преобразовать выражения ereg в preg в PHP? - PullRequest
131 голосов
/ 07 июня 2011

Поскольку Регулярные выражения POSIX (ereg) устарели, начиная с PHP 5.3.0, я хотел бы узнать простой способ преобразования старых выражений в PCRE (регулярные выражения, совместимые с Perl) ( PREG) .

Например, у меня есть регулярное выражение:

eregi('^hello world');

Как я могу перевести выражения в preg_match совместимые выражения?

Примечание: Этот пост служит заполнителем для всех сообщений, связанных с переходом с ereg на preg, и дублирует варианты связанных вопросов. Пожалуйста, не закрывайте этот вопрос.

Похожие:

Ответы [ 4 ]

132 голосов
/ 07 июня 2011

Самым большим изменением в синтаксисе является добавление разделителей .

ereg('^hello', $str);
preg_match('/^hello/', $str);

Разделителями могут быть практически все, что не является буквенно-цифровым символом, обратной косой чертой или пробельным символом. Обычно используются ~, / и #.

Вы также можете использовать соответствующие скобки:

preg_match('[^hello]', $str);
preg_match('(^hello)', $str);
preg_match('{^hello}', $str);
// etc

Если ваш разделитель найден в регулярном выражении, вы должны его избежать:

ereg('^/hello', $str);
preg_match('/^\/hello/', $str);

Вы можете легко экранировать все разделители и зарезервированные символы в строке, используя preg_quote :

$expr = preg_quote('/hello', '/');
preg_match('/^'.$expr.'/', $str);

Кроме того, PCRE поддерживает модификаторы для различных вещей. Одним из наиболее часто используемых является регистрозависимый модификатор i, альтернатива eregi :

eregi('^hello', 'HELLO');
preg_match('/^hello/i', 'HELLO');

Вы можете найти полную ссылку на синтаксис PCRE в PHP в руководстве , а также список отличий между регулярным выражением POSIX и PCRE, чтобы помочь преобразовать выражение.

Однако в вашем простом примере вы бы не использовали регулярное выражение:

stripos($str, 'hello world') === 0
30 голосов
/ 24 апреля 2013

Замена Ereg на preg (по состоянию на PHP 5.3.0) была правильным шагом в нашу пользу.

preg_match, использующий Perl-совместимый синтаксис регулярного выражения, часто является более быстрой альтернативой ereg.*

Вы должны знать 4 основные вещи, чтобы портировать шаблоны ereg на preg:

  1. Добавить разделители (/): 'pattern' => '/pattern/'

  2. Escape-разделитель , если эточасть шаблона: 'patt/ern' => '/patt\/ern/'Добейтесь этого программно следующим образом:$old_pattern = '<div>.+</div>';$new_pattern = '/' . addcslashes($old_pattern, '/') . '/';

  3. eregi (сопоставление без учета регистра): 'pattern' => '/pattern/i' Итак, если вы используете функцию eregi для сопоставления без учета регистра, просто добавьте 'i'в конце нового шаблона ('/ pattern /').

  4. ASCII-значения : если вы используете число в шаблоне, то предполагается, чтоВы имеете в виду ASCII символа.Но в preg число не рассматривается как значение ASCII.Итак, если ваш шаблон содержит значение ASCII в выражении ereg (например: новая строка, табуляция и т. Д.), Преобразуйте его в шестнадцатеричное и добавьте префикс \ x.Example: 9(tab) becomes \x9 or alternatively use \t.

7 голосов
/ 01 декабря 2016

Существует больше различий между ereg() и preg_replace(), чем просто синтаксис:

  • Возвращаемое значение:

    • При ошибке : оба возвращают FALSE
    • при отсутствии совпадений : ereg() возвращает FALSE, preg_match() возвращает 0
    • при совпадении: ereg() возвращает длину строки или 1, preg_match() возвращает всегда 1
  • Результирующий массив совпадающих подстрок: если какая-либо подстрока не найденавообще ((b) в ...a(b)?), соответствующий элемент в ereg() результате будет FALSE, тогда как в preg_match() он не будет установлен вообще.

Если человек недостаточно смел, чтобы преобразовать его или ее ereg() в preg_match(), он или она может использовать mb_ereg () , который все еще доступен в PHP 7.

6 голосов
/ 12 февраля 2016

Начиная с версии PHP 5.3, ereg устарела.

Переход от ereg к preg_match - это лишь небольшое изменение в нашем паттерне.

Во-первых, вы должны добавить разделители в ваш код, например ::

ereg('A-Z0-9a-z', 'string');

до

preg_match('/A-Z0-9a-z/', 'string');

Для eregi сопоставления без учета регистра ставьте i после последнего разделителя, например ::

eregi('pattern', 'string');

до

preg_match ('/pattern/i', 'string');
...