Как я могу конвертировать выражения ereg в preg в PHP?
С регулярные выражения POSIX (ereg) устарели с PHP 5.3.0, я хотел бы знать простой способ конвертировать старые выражения в PCRE (Perl совместимые регулярные выражения) (preg).
например, у меня есть следующее регулярное выражение:
eregi('^hello world');
Как я могу перевести выражения в preg_match
совместимые выражения?
Примечание: это сообщение служит в качестве заполнителя для всех сообщений связано с преобразованием из ereg в preg, а также в качестве дублирующих вариантов для связанных вопросов. пожалуйста, не закрывайте этот вопрос.
по теме:
- как изменить PHP eregi на preg_match
- Изменение ereg_replace на эквивалентный preg_replace
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 и В нестандартном месте, получить помощь в преобразовании выражений.
однако в вашем простом примере вы не будете использовать регулярное выражение:
stripos($str, 'hello world') === 0
замена Ereg на preg (по состоянию на PHP 5.3.0) была правильным шагом в нашу пользу.
preg_match, который использует синтаксис регулярных выражений, совместимый с Perl, часто является более быстрой альтернативой ereg.
вы должны знать 4 основные вещи для переноса шаблонов ereg в preg:
добавить разделители (/):
'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
сопоставление без учета регистра, puti
после последнего разделителя, например: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.