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

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

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

eregi('^hello world'); 

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

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

Связанный:

  • Как изменить eregi PHP на preg_match
  • Изменение ereg_replace на эквивалентное preg_replace

Related of "Как преобразовать выражения ereg в preg в 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 

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

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

Вы должны знать 4 основных элемента для переноса шаблонов ereg в preg:

  1. Добавить разделители (/): 'pattern' => '/pattern/'

  2. Escape delimiter, если он является частью шаблона: 'patt/ern' => '/patt\/ern/'
    Обеспечьте его программно следующим образом:
    $old_pattern = '<div>.+</div>';
    $new_pattern = '/' . addcslashes($old_pattern, '/') . '/';

  3. eregi ( совпадение без учета регистра): 'pattern' => '/pattern/i' Итак, если вы используете функцию eregi для соответствия case insenstive, просто добавьте 'i' в конец нового шаблона ('/ pattern /') ,

  4. Значения ASCII : В ereg, если вы используете номер в шаблоне, предполагается, что вы ссылаетесь на ASCII символа. Но в preg число не рассматривается как значение ASCII. Таким образом, если ваш шаблон содержит значение ASCII в выражении ereg (например: новая строка, табуляции и т. Д.), Преобразуйте его в шестнадцатеричный и префикс с помощью \ x.
    Example: 9(tab) becomes \x9 or alternatively use \t.

Из версии PHP версии 5.3 устаревший.

Для перехода к ereg to preg_match просто небольшое изменение в нашем шаблоне

Сначала вы добавили делиметр к вашему коду

например ereg('A-Z0-9a-z','string');

в

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

Для eregieregi чувствительного совпадения 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) in ...a(b)? ), Соответствующий элемент в результате ereg() будет FALSE , а в preg_match() он не будет установлен вообще.

Если кто-то не достаточно храбр, чтобы преобразовать его или ее ereg() в preg_match() , он или она может использовать mb_ereg () , который по-прежнему доступен в PHP 7.