среда, 16 июня 2010 г.

Regexp to replace placeholders at string (замена плейсхолдеров в строке на элементы массива)

Довольно часто встречается задача подстановок каких-либо значений из ассоциативного массива  в определённые места в строке. Думаю, многие повседневно сталкиваются с ней при формировании персонализированных email-писем, формировании мультиязычных сообщений пользователю с подстановками из личных данных и других повседневных задачах.
Задача замены плейсхолдеров, или так называемых меток-заполнителей, в строке на соответствующие элементы ассоциативного массива может быть решена несколькими способами, но, на мой взгляд, самый элегантный способ - при помощи preg-а (регулярных выражений).
Допустим, у нас есть ассоциативный массив с подстановками $placeholders, и строка $str c метками-заполнителями вида {var_name}, в которой нужно произвести замену на соответствующие значения из массива. Решение на PHP будет выглядеть следующим образом:
$placeholders = array("name"=>"User", "link"=>"http://webaurum.blogspot.com");
$str = "Hello {name}, you are here {link}";
echo preg_replace('~\{\w+\}~e', '@$placeholders$0', $str);
echo preg_replace( '/\{(\w+)\}/e', '@$placeholders["\\1"]', $str);
Две последние строки абсолютно идентичны по функциональному назначению, я их просто привёл для примера, может кому-то будет понятнее второй вариант. Обе последние строки вернут результат:
Hello User, you are here http://webaurum.blogspot.com
Реализация работает быстро и элегантно, использую во многих собственных проектах.

2 комментария:

  1. Не знал, что можно массив передать, круто.
    я обычно пользовался:
    preg_replace("/($topgroup)$/si","<span class=\"topg\">\\1</span>",$kadabra);

    ОтветитьУдалить
  2. да, оно так кошерно получается

    ОтветитьУдалить

Рекоммендую

Попробуйте надёжный хостинг от Scala Hosting