3

在 PHP 字符串中替换一组短标签的最佳方法是什么,例如:

$return = "Hello %name%, thank you for your interest in the %product_name%.  %representative_name% will contact you shortly!";

我将在其中定义 %name% 是某个字符串,来自数组或对象,例如:

$object->name;
$object->product_name;

ETC..

我知道我可以在一个字符串上多次运行 str_replace,但我想知道是否有更好的方法来做到这一点。

谢谢。

4

4 回答 4

14

如果您知道要替换的占位符,str_replace() 似乎是一个理想的选择。这需要运行一次而不是多次。

$input = "Hello %name%, thank you for your interest in the %product_name%.  %representative_name% will contact you shortly!";

$output = str_replace(
    array('%name%', '%product_name%', '%representative_name%'),
    array($name, $productName, $representativeName),
    $input
);
于 2010-07-03T19:56:05.677 回答
2

这个类应该这样做:

<?php
class MyReplacer{
  function __construct($arr=array()){
    $this->arr=$arr;
  }

  private function replaceCallback($m){
    return isset($this->arr[$m[1]])?$this->arr[$m[1]]:'';
  }

  function get($s){  
    return preg_replace_callback('/%(.*?)%/',array(&$this,'replaceCallback'),$s);
  }

}


$rep= new MyReplacer(array(
    "name"=>"john",
    "age"=>"25"
  ));
$rep->arr['more']='!!!!!';  
echo $rep->get('Hello, %name%(%age%) %notset% %more%');
于 2010-07-03T21:11:01.020 回答
2

最简单和最短的选项是 preg_replace 与 'e' 开关

$obj = (object) array(
    'foo' => 'FOO',
    'bar' => 'BAR',
    'baz' => 'BAZ',
);

$str = "Hello %foo% and %bar% and %baz%";
echo preg_replace('~%(\w+)%~e', '$obj->$1', $str);
于 2010-07-04T00:00:02.710 回答
1

来自 str_replace 的 PHP 手册:

如果searchreplace是数组,则 str_replace()从每个数组中获取一个值,并使用它们对subject进行搜索和替换。如果 replace 的值比 search 少,则将空字符串用于其余的替换值。如果 search 是一个数组并且 replace 是一个字符串,那么这个替换字符串将用于 search 的每个值。但是,反过来就没有意义了。

http://php.net/manual/en/function.str-replace.php

于 2010-07-03T19:53:21.463 回答