【问题标题】:PHP Repalce text tags with another value that i have in arrayPHP用我在数组中的另一个值替换文本标签
【发布时间】:2013-11-12 18:47:29
【问题描述】:

我有这段文字:

$text = "Welcome {name}, this is your email address: {email}";

我想一次性替换 {name} 和 {email} 标签,而不是使用str_replace("{name}","John",$text)一一替换

我已经通过这种方式获得了替换输出:

$values_to_replace = array('name'=>'John','email'=>'blabla@gmail.com');

如何使用给定的$values_to_replace 从一个镜头中替换整个文本?

【问题讨论】:

  • 你能把数组改成array('{name}'=>'John'吗?它会让事情变得更容易。

标签: php arrays tags str-replace


【解决方案1】:

这里有几种方法:

首先是strtr()。它需要一个 key=>value 数组并将所有出现的 key 替换为 value。

$values = array('name'=>'John','email'=>'blabla@gmail.com');
$text = "Welcome {name}, this is your email address: {email}";

$replacements = array();
foreach ($values as $name => $value) {
  $replacements['{'.$name.'}'] = $value;
}
var_dump(strtr($text, $replacements));

第二个 str_replace() 支持 $search 和 $replace 参数的数组。

$values = array('name'=>'John','email'=>'blabla@gmail.com');
$text = "Welcome {name}, this is your email address: {email}";  

$search = array_map(
  function($placeholder) {
    return '{'.$placeholder.'}';
  },
  array_keys($values)
);
var_dump(str_replace($search, $values, $text));

第三个选项很有趣,如果你想处理所有的 {something} 事件。这需要正则表达式和逻辑,因此需要 preg_replace_callback。

$values = array('name'=>'John','email'=>'blabla@gmail.com');
$text = "Welcome {name}, this is your email address: {email}";      

$replacer = function($match) use ($values) {
  if (isset($values[$match['name']])) {
    return $values[$match['name']];
  } else {
    return '';
  }
};
var_dump(preg_replace_callback('(\\{(?P<name>[a-z\d]+)\\})i', $replacer, $text));

【讨论】:

  • 感谢您的帮助,但我更喜欢 AbraCadaver 的答案,它更易于使用。欢呼
【解决方案2】:

既然您可以更改数组键以匹配要替换的文本,那么就这么简单:

$values_to_replace = array('{name}'=>'John','{email}'=>'blabla@gmail.com');
$text = str_replace(array_keys($values_to_replace), $values_to_replace, $text);

或者正如 Sébastien 所展示的那样。

要回答您的评论,有多种方法,塞巴斯蒂安就是其中之一。这是另一个:

$search = explode(',', '{'.implode('},{', array_keys($values_to_replace)).'}');
$text = str_replace($search, $values_to_replace, $text);

【讨论】:

  • 谢谢,这成功了,即使顺序不同也会替换值。
  • 无论如何,如果无法将其更改为array('{name}'=&gt;'John',您可以使其工作吗?你会让我开心
【解决方案3】:

str_replace可以将数组作为参数:

$text = "Welcome {name}, this is your email address: {email}";

$from = array("{name}", "{email}");
$to = array("John", "blabla@gmail.com");

$new_text = str_replace( $from , $to, $text );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-19
    • 2021-09-04
    • 2015-06-24
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多