поскольку POSIX регулярные выражения (ereg) устарели, начиная с PHP 5.3.0, я хотел бы знать простой способ конвертировать старые выражения в PCRE (регулярные выражения, совместимые с Perl) (preg).
Например, у меня есть это регулярное выражение:
eregi('^hello world');
Как я могу перевести выражения в preg_match
совместимые выражения?
Замечания: Этот пост служит заполнителем для всех постов, связанных с переходом с ereg на preg, а также дублирует варианты связанных вопросов. Пожалуйста, не закрывайте этот вопрос.
Связанные с:
Самое большое изменение в синтаксисе — это добавление разделители.
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 regex и PCRE, чтобы помочь преобразовать выражение.
Однако в вашем простом примере вы бы не использовали регулярное выражение:
stripos($str, 'hello world') === 0
Замена Ereg на preg (начиная с PHP 5.3.0) была правильным шагом в нашу пользу.
preg_match, который использует Perl-совместимый синтаксис регулярных выражений, часто является более быстрой альтернативой ereg.
Вы должны знать 4 основных вещи, чтобы портировать шаблоны ereg в preg:
Добавить разделители(/): 'pattern' => '/pattern/'
Escape delimiter если это часть шаблона: 'patt/ern' => '/patt\/ern/'
Добейтесь этого программно следующим образом:
$old_pattern = '<div>.+</div>';
$new_pattern = '/' . addcslashes($old_pattern, '/') . '/';
eregi(сопоставление без учета регистра): 'pattern' => '/pattern/i'
Поэтому, если вы используете функцию eregi для сопоставления без учета регистра, просто добавьте «i» в конце нового шаблона («/ pattern /»).
Значения ASCII: Ereg, если вы используете число в шаблоне, предполагается, что вы ссылаетесь на ASCII символа. Но в preg число не рассматривается как значение ASCII. Итак, если ваш шаблон содержит значение ASCII в выражении ereg (например: новая строка, табуляция и т. Д.), Преобразуйте его в шестнадцатеричное и добавьте префикс \ x.
Example: 9(tab) becomes \x9 or alternatively use \t.
Есть больше различий между 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.
Начиная с версии 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');