Замена с помощью регулярных выражений. Модификатор e

Вряд ли кто-то станет спорить об удобстве обработки текстовых данных с помощью регулярных выражений. Механизм, конечно не идеальный в первую очередь из-за невысокой скорости работы, но зато универсальный. Я так же не обхожу их стороной в своих скриптах, периодически открывая новые горизонты их использования.

Вообще в php (особенно по сравнению с c++) такое количество функций, что знать их все просто невозможно. Так как за все время я не удосужился прочесть ни одной книги по php мне приходится узнавать о его возможностях из статей, примеров скриптов и php manual. Совсем недавно я открыл для себя отличную функцию extract, после чего многие мои функции стали принимать в качестве аргументов лишь один параметр.

А сегодня я хочу поговорить o preg_replace и модификаторе e

Позволю себе еще одно отступление. Почему-то многие не обращают внимания на модификаторы в регулярных выражениях и не используют ничего кроме извечного i, незаслуженно обижая модификатор жадности U, который очень часто способен сократить код. Например, для вырезания тегов с помощью регулярных выражений достаточно написать

  1. preg_replace('#<.+>#Ui', '', $text);

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

Простая замена выглядит так ...

  1. $text = 'Некоторый, текст [subj], в который надо подставить [macro]';
  2. $subj = 'o php';
  3. preg_replace('#\[subj\]#Ui', $subj, $text);
  4. preg_replace('#\[macro\]#Ui', 'макрос', $text);

... можно ограничиться одним вызовом, объединив данные в массивы ...

  1. $text = 'Некоторый, текст [subj], в который надо подставить [macro]';
  2. $patterns[] = '#\[subj\]#Ui'; $values[] = 'o php';
  3. $patterns[] = '#\[macro\]#Ui'; $values[] = 'макрос';
  4. preg_replace($patterns, $values, $text);

Такой вариант, конечно, удобнее, но он ограничивает число подстановок заранее определенным набором значений. К тому же приходится следить за совпадением индексов в массивах. И здесь на выручку приходит модификатор e

  1. $text = 'Некоторый, текст [subj], в который надо подставить [macro]';
  2. $values['subj'] = 'o php';
  3. $values['macro'] = 'макрос';
  4. preg_replace('#\[(.+)\]#Uie', "\\$values['\\\\1']", $text);

Теперь для использования нового макроса достаточно определить элемент массива values с соответствующим именем. Для использования в боевых условиях можно добавить проверку, вызвав для этого функцию, например вот так, заменяя неопределенный макрос на пустую строку.

  1. function replace_macro($key, &$values)
  2. {
  3. //Использование функции оставляет широчайший простор для вашего творчества.
  4. return isset($values[$key]) ? $values[$key] : '';
  5. }
  6.  
  7. $text = 'Некоторый, текст [subj], в который надо подставить [macro]';
  8. $values['subj'] = 'o php';
  9. $values['macro'] = 'макрос';
  10. preg_replace('#\[(.+)\]#Uie', "replace_macro('\\\\1', \\$values)", $text);

Читайте в блоге

Раскрашиваем код на сайте. GeShi - PHP Code Colorer
Ссылки. TimePicker. javascript на сервере. DOM парсер
Funky Cache
Несколько слов об использовании Mercurial.
JavaScript Property Tree. Реализация дерева свойств на JavaScript

Метки: php regexp

Комментарии:

Владимир Рыбаков @ 19.11.2009 08:29


http://www.phpfreaks.com/blog/pcre-regex-spotlight-k

http://pcre.org/pcre.txt

Войдите на сайт, чтобы оставить комментарий