Разработчику. Сборник рецептов PHP
Задавайте вопросы

Переход от 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/(*) поскольку в нем должны быть указаны разделители, как в языке Perl. Следовательно:

ereg('pattern', 'string');

превращается в:

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

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

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

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

Значение переменной $preg_pattern теперь равно <b>.+<\/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 для обозначения табуляции, возврата каретки и перевода строки соответственно.


(*)   Или {}, <>, ||, ## или любая другая пара разделителей, которую вы предпочтете. PHP поддерживает их все.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ