Как я могу конвертировать выражения 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 120

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:

  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.

из PHP версии 5.3, ereg устарела.

двигался от ereg до preg_match - это всего лишь небольшое изменение в наш шаблон.

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

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

до

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

на eregi сопоставление без учета регистра, put 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.