Как заменить несколько% тэгов% в строке на PHP - PullRequest
3 голосов
/ 03 июля 2010

Каков наилучший способ замены набора коротких тегов в строке 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;

и т. д.

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

Спасибо.

Ответы [ 4 ]

13 голосов
/ 03 июля 2010

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
);
2 голосов
/ 04 июля 2010

Самый простой и короткий вариант - 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);
2 голосов
/ 04 июля 2010

Этот класс должен это сделать:

<?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%');
1 голос
/ 03 июля 2010

Из руководства по PHP для str_replace:

Если search и заменяют на массивы, тогда str_replace () принимаетзначение из каждого массива и использует их для поиска и замены на subject .Если замена имеет меньше значений, чем поиск, тогда для остальных значений замены используется пустая строка.Если поиск - это массив, а замена - это строка, то эта строка замены используется для каждого значения поиска.Однако обратное не имеет смысла.

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

...