Поскольку регулярные выражения POSIX (ereg) устарели с PHP 5.3.0, я хотел бы знать простой способ конвертировать старые выражения в PCRE (Perl-совместимые регулярные выражения) (preg) .
Например, у меня есть это регулярное выражение:
eregi('^hello world');
Как перевести выражения в preg_match
совместимые выражения?
Примечание: этот пост служит заполнителем для всех постов, связанных с преобразованием из ereg в preg, и как дублирующие варианты для связанных вопросов. Пожалуйста, не закрывайте этот вопрос.
Связанный:
php
preg-replace
preg-match
pcre
ereg
сетевой кодер
источник
источник
ereg [php]
не дает очень полезных результатов. Хорошо, могу поддержать это.Ответы:
Самое большое изменение в синтаксисе - добавление разделителей .
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
источник
/^\/hello/
пример.(a(b)c)
- это совершенно допустимый PCRE с разделителями. Мне лично нравится использовать круглые скобки,()
чтобы напоминать себе, что первое зафиксированное совпадение - это все.error_log
добудет полон эти предупреждения:PHP Deprecated: Function ereg() is deprecated in...
. Ах!Замена Ereg на preg (начиная с PHP 5.3.0) была правильным шагом в нашу пользу.
preg_match, который использует синтаксис регулярных выражений, совместимый с Perl, часто является более быстрой альтернативой ereg.
Чтобы портировать шаблоны ereg на preg, нужно знать 4 основных момента:
Добавьте разделители (/):
'pattern' => '/pattern/'
Разделитель escape, если он является частью шаблона:
'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.
источник
Начиная с версии 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');
источник
Между синтаксисом
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.источник