2015-12-01 3 views
2

Предположим, у меня есть следующая строка, которую я хочу отправить клиенту как электронное письмо.Заменить переменные из текста соответствующими значениями

"Hello Mr/Mrs {{Name}}. You have subscribed for {{Service}} at {{Date}}." 

И у меня есть массив со значениями, которые должны быть заменены

array(
    'Name' => $customerName, //or string 
    'Service' => $serviceName, //or string 
    'Date' => '2015-06-06' 
); 

я могу найти все строки между {{..}} с этим:

preg_match_all('/\{{(.*?)\}}/',$a,$match); 

где $ match - это массив со значениями. Но мне нужно заменить каждое соответствие соответствующим значением из массива со значениями

Обратите внимание, что массив со значениями содержит намного больше значений, а количество элементов в нем или последовательность ключей не относится к числу совпадений в строке.

+0

качестве альтернативой вы можете использовать существующий механизм шаблонов, который уже делает это. Или используйте библиотеку, которая отправляет почту и принимает переменные типа. –

ответ

3

Вы можете использовать preg_replace_callback и передать массив с помощью use к функции обратного вызова:

$s = "Hello Mr/Mrs {{Name}}. You have subscribed for {{Service}} at {{Date}} {{I_DONT_KNOW_IT}}."; 
$arr = array(
    'Name' => "customerName", //or string 
    'Service' => "serviceName", //or string 
    'Date' => '2015-06-06' 
); 
echo $res = preg_replace_callback('/{{(.*?)}}/', function($m) use ($arr) { 
     return isset($arr[$m[1]]) ? $arr[$m[1]] : $m[0]; // If the key is uknown, just use the match value 
    }, $s); 
// => Hello Mr/Mrs customerName. You have subscribed for serviceName at 2015-06-06. 

См IDEONE demo.

$m[1] относится к тому, что было зафиксировано (.*?). Я предполагаю, что этот шаблон достаточно для текущего сценария (не требуется разворачивать, поскольку строки, которые он соответствует, относительно короткие).

+1

Спасибо. Это то, что я искал. – Ivo

+0

Я предлагаю 'return isset ($ arr [$ m [1]])? $ arr [$ m [1]]: ''; 'в случае, если в словаре есть теги, которые не зарегистрированы. – Amarnasan

+0

@Amarnasan: Да, хорошее предложение. Если ожидаемое поведение - просто удалить неизвестные теги, это сработает. Иво, пожалуйста, проверьте, является ли это ожидаемым поведением, и я соответствующим образом обновлю ответ. –

1

Вам не нужно использовать регулярное выражение для этого, вы можете сделать это с простой функцией замены, если вы немного изменить ключи массива:

$corr = array(
    'Name' => $customerName, //or string 
    'Service' => $serviceName, //or string 
    'Date' => '2015-06-06' 
); 

$new_keys = array_map(function($i) { return '{{' . $i . '}}';}, array_keys($corr)); 
$trans = array_combine($new_keys, $corr); 

$result = strtr($yourstring, $trans); 
1

Попробуйте

<?php 

$str = "Hello Mr/Mrs {{Name}}. You have subscribed for {{Service}} at {{Date}}."; 

$arr = array(
    'Name' => 'some Cust', //or string 
    'Service' => 'Some Service', //or string 
    'Date' => '2015-06-06' 
); 

$replaceKeys = array_map(
    function ($el) { 
     return "{{{$el}}}"; 
    }, 
    array_keys($arr) 
); 

$str = str_replace($replaceKeys, array_values($arr), $str); 

echo $str; 
Смежные вопросы