Как преобразовать выражения ereg в preg в PHP?

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

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

eregi('^hello world');

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

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

По теме:


person netcoder    schedule 07.06.2011    source источник
comment
@ yes123: Да в том-то и дело, я тоже от этого устала. Мне нужен пост в вики, который действительно кое-что объясняет, чтобы мы могли закрыть все эти отдельные вопросы.   -  person netcoder    schedule 07.06.2011
comment
Думаю, в этом нет необходимости, потому что нужно просто обернуть старое разделителем. Также я думаю, что вы могли бы использовать для этого предыдущий ответ на вопрос.   -  person dynamic    schedule 07.06.2011
comment
Ах, проголосовал за закрытие, прежде чем читать комментарии. В качестве заполнителя он может служить определенной цели, но разве нет другого более старого вопроса, который мог бы служить таковым?   -  person Wrikken    schedule 07.06.2011
comment
Хм, действительно. ereg [php] не дает очень полезных результатов. Хорошо, могу поддержать это.   -  person Wrikken    schedule 07.06.2011
comment
@netcoder: на самом деле я думаю, что ответил почти на все здесь: stackoverflow.com/questions/6269693/, чтобы конечно не хвастаться   -  person dynamic    schedule 07.06.2011
comment
Ребята, мы, кажется, почти создали круг закрытых вопросов по этой теме, и все они указывают друг на друга. В таком случае они все закроются :)   -  person Kev    schedule 07.06.2011


Ответы (4)


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

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
person Community    schedule 07.06.2011
comment
Замечательное объяснение! Я хотел бы просто добавить особый случай, когда вы конвертируете из ereg в preg_match, и вам нужно экранировать только разделители, а не зарезервированные символы (потому что они уже были работая как специальные символы, мы не хотим их экранировать): preg_match ('/'. str_replace ('/', '\ /', $ expr). '/', $ str); - person Lolito; 05.11.2013
comment
Особенно стоит отметить, что если вы используете совпадающие скобки, вам не нужно экранировать какие-либо символы только потому, что он такой же, как и разделитель, как вы делаете с другими символами, такими как пример /^\/hello/. (a(b)c) - это совершенно допустимый PCRE с разделителями. Мне лично нравится использовать круглые скобки (), чтобы напоминать себе, что первое зафиксированное совпадение - это все. - person Niet the Dark Absol; 28.03.2017
comment
как это преобразовать? $ regex = $ e. '((\. [^ \.'. $ e. '] [^'. $ e. '] *) | (\. \. [^'. $ e. '] +) | ([^ \. ] [^ '. $ e.'] *)) '. $ е. '\. \.' . $ e; для preg_math он выполняет свою работу, просто добавляя / модификатор / - person bdalina; 20.11.2017

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

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

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

person Sumoanand    schedule 24.04.2013

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

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

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

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

to

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

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

eregi('pattern', 'string');

to

preg_match ('/pattern/i', 'string');
person Narayan    schedule 12.02.2016

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

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

    • On error: both return 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.

person Roman Hocke    schedule 01.12.2016