【问题标题】:PHP replace string between curly brackets with array element valuePHP用数组元素值替换大括号之间的字符串
【发布时间】:2015-09-02 21:44:34
【问题描述】:

我有一段被读入的内容,它包含许多字符串,如{{some_text}},我想做的是找到所有这些出现并用数组中的另一个值替换它们,例如@987654322 @。

我尝试过使用 preg_replace 但不确定如何将找到的文本放在括号之间并将其用于替换值。

$body = "This is a body of {{some_text}} text from a book.";
$text["some_text"] = "really cool";
$parsedBody = preg_replace("\[{].*[}]/U", $text[""], $body);

如您所见,我试图从字符串中取出 some_texttext 并使用它来调用数组中的元素,这个示例非常基础,因为 $bodyvalue 大得多,而 @987654326 @也有几百个元素。

【问题讨论】:

  • 使用preg_replace_callback
  • 或者你应该投资一个真正的模板库。
  • @Barmar,谢谢你的建议,我现在看看preg_replace_callback,因为我需要的是使用模板库。
  • 另一种方法是使用 preg_split 和 PREG_SPLIT_DELIM_CAPTURE 选项,映射数组并替换奇数项(使用关联数组)并内爆。
  • @Barmar,在我的自定义代码变得过于复杂后采纳了您的建议,现在通过 composer 使用 twig,让生活更轻松,谢谢。

标签: php regex preg-replace


【解决方案1】:

您可以使用preg_replace_callback 并使用捕获组([^}]+) 在数组$text 中查找索引:

$repl = preg_replace_callback('/{{([^}]+)}}/', function ($m) use ($text) {
            return $text[$m[1]]; }, $body);
//=> This is a body of really cool text from a book.

use ($text) 语句将$text 的引用传递给匿名function

【讨论】:

    【解决方案2】:

    反之如何 - 不是查找所有 {{...}} 占位符并查找它们的值,而是遍历所有值并替换匹配的占位符,如下所示:

    foreach ($text as $key => $value) {
        $placeholder = sprintf('{{%s}}', $key);
        $body        = str_replace($placeholder, $value, $body);
    }
    

    你甚至可以把它包装成一个函数:

    function populatePlaceholders($body, array $vars)
    {
        foreach ($vars as $key => $value) {
            $placeholder = sprintf('{{%s}}', $key);
            $body        = str_replace($placeholder, $value, $body);
        }
    
        return $body;
    }
    

    【讨论】:

    • 聪明的方法来做这件事! ?
    【解决方案3】:

    只是为了好玩,按原样使用您的数组:

    $result = str_replace(array_map(function($v){return '{{'.$v.'}}';}, array_keys($text)),
                          $text, $body);
    

    或者,如果您的数组类似于 $text['{{some_text}}'],那么只需:

    $result = str_replace(array_keys($text), $text, $body);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 2017-12-02
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 2013-11-25
      • 2017-08-04
      • 1970-01-01
      相关资源
      最近更新 更多