Переход от ereg к preg

Задача
Необходимо отказаться от применения функций ereg в пользу функций preg.

Решение
Сначала добавим в шаблон ограничители:

preg_match('/pattern/', 'string')

Для не чувствительного к регистру сравнения с помощью функции eregi() укажите модификатор /i:

preg_match('/pattern/i', 'string');

Если целые числа выступают вместо строк в качестве шаблонов или замещающих значений, преобразуйте число в шестнадцатеричную форму и укажите его с помощью escape-последовательности:

$hex = dechex($number);
preg_match("/\x$hex/", 'string');

Обсуждение
Есть несколько существенных различий между ereg и preg. Во-первых, в случае применения функций preg шаблон представляет собой не просто строку pattern, а выглядит как /pattern/,1 поскольку в нем должны быть указаны разделители, как в языке Perl.

Следовательно:

ereg('pattern', 'string');
превращается в:
preg_match('/pattern/', 'string');

При выборе разделителей шаблона нельзя размещать символы-разделители внутри самого шаблона регулярного выражения, иначе вы слишком рано закроете шаблон.


Если обойти это препятствие не удается, то любое вхождение символов-разделителей в шаблон надо экранировать с помощью символа обратной косой черты. Вместо того чтобы делать это вручную, вызовите функцию addcslashes().

Например, если в качестве разделителя выступает символ /:

$ereg_pattern = '.+';
$preg_pattern = addcslashes($ereg_pattern, '/');

Значение переменной $preg_pattern теперь равно .+<\/b>.

Среди функций preg нет аналогичного набора функций, не чувствительных к регистру. Все они могут содержать не чувствительный к регистру модификатор. Для перехода к другому набору функций замените:

eregi('pattern', 'string');
на:
preg_match('/pattern/i', 'string');

Изменение осуществляется добавлением символа i после завершающего разделителя.Наконец, еще одно, последнее, не совсем явное различие. Если в функции ereg_replace() в качестве шаблона или замещающего значения выступает число (а не строка), то предполагается, что этим вы указываете ASCII-код символа. Поэтому, а также потому, что 9 – это ASCII-представление символа табуляции (т. е. \t), следующий код вставит символ табуляции в начало каждой строки:

$tab = 9;
$replaced = ereg_replace('^', $tab, $string);

А таким способом будет выполнено преобразование символов перевода строки:

$converted = ereg_replace(10, 12, $text);

Чтобы предотвратить такое поведение функции, в функциях ereg запись должна быть такой:

$tab = '9';

С другой стороны, функция preg_replace() рассматривает число 9 как число 9, а не как заместитель символа табуляции.


Чтобы конвертировать коды символов для использования в функции preg_replace(), преобразуйте их в шестнадцатеричную форму и добавьте к ним префикс \x.

Например, 9 становится \x9 или \x09, а 12 превращается в \ x0c. В качестве альтернативы можно использовать \t, \r и \n для обозначения табуляции, возврата каретки и перевода строки соответственно.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Выбор между поглощающим и непоглощающим сравнением
Нахождение n-го совпадения
Поиск в файле всех строк, соответствующих шаблону
Поиск слов
Проверка правильности адресов электронной почты

Вернуться в раздел: PHP / 13. Регулярные выражения