【问题标题】:Replace variables from text with corresponding values用相应的值替换文本中的变量
【发布时间】:2016-03-05 08:35:18
【问题描述】:

假设我有以下字符串,我想将其作为电子邮件发送给客户。

"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 是一个带有值的数组,但我需要用带有值的数组中的对应值替换每个匹配项

请注意,具有值的数组包含更多的值,其中的项目数或键序列与字符串中的匹配数无关。

【问题讨论】:

  • 作为替代方案,您可以使用已经执行此操作的现有模板引擎。或者使用发送邮件并接受此类变量的库。

标签: php regex replace preg-replace preg-match


【解决方案1】:

您可以使用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] 指的是由(.*?) 捕获的内容。我想这种模式对于当前场景来说已经足够了(不需要展开,因为它匹配的字符串相对较短)。

【讨论】:

  • 谢谢。这就是我一直在寻找的。​​span>
  • 我建议return isset($arr[$m[1]]) ? $arr[$m[1]] : '';,以防字典中没有注册一些标签。
  • @Amarnasan:是的,一个很好的建议。如果预期的行为只是删除未知标签,这将起作用。 Ivo,请检查这是否是预期的行为,我会相应地更新答案。
  • 是的,我当然实现了。即使我是这样写的: return isset($arr[$m[1]]) ? $arr[$m[1]] : '{{'.$m[1].'}}';因此,如果没有匹配,它将返回 {{key}} 以知道给定的密钥不正确
  • 我建议只使用代表整个匹配文本的$m[0]。在示例字符串中,我添加了{{I_DONT_KNOW_IT}},由于字典中没有对应的键,因此按原样输出。
【解决方案2】:

你不需要为此使用正则表达式,如果你改变一点数组键,你可以用一个简单的替换函数来做到这一点:

$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);

【讨论】:

    【解决方案3】:

    试试

    <?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;
    

    【讨论】:

      猜你喜欢
      • 2011-11-30
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 2023-03-26
      • 2015-10-03
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多