2010-07-03 5 views
3

Quelle est la meilleure façon de remplacer un ensemble de balises courtes dans une chaîne de PHP, par exemple:Comment remplacer les étiquettes multiples%% dans une chaîne avec PHP

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

où je définirais que% name% est une certaine chaîne, à partir d'un tableau ou un objet tel que:

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

etc ..

Je sais que je pouvais courir str_replace plusieurs fois sur une chaîne, mais je me demandais s'il y a une meilleure façon de Faisant cela.

Merci.

Répondre

11

str_replace() semble une option idéale si vous connaissez les espaces réservés vous souhaitez remplacer. Cela doit être exécuté une seule fois pas plusieurs fois.

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

A partir du manuel PHP pour str_replace:

Si recherche et remplacer sont des tableaux, puis str_replace() prend une valeur de chaque tableau et les utilise pour ne rechercher et remplacez le sous le numéro. Si le remplacement a moins de valeurs que la recherche, une chaîne vide est utilisée pour le reste des valeurs de remplacement . Si search est un tableau et que replace est une chaîne, alors cette chaîne de remplacement est utilisée pour chaque valeur de recherche. L'inverse n'aurait pas de sens, cependant.

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

2

Cette classe doit faire:

<?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%'); 
+0

plus simple et la plus courte l'option Cela semble être une bonne façon de le faire, et est plus proche de ce que je cherchais. Je vais devoir faire un benchmark pour voir comment cela se compare à l'utilisation de la fonction str_replace(). J'ai l'impression que str_replace() sera plus rapide, mais cette classe peut être plus facile à utiliser en pratique. – Andy

2

Le est preg_replace avec le 'e' interrupteur

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

$str = "Hello %foo% and %bar% and %baz%"; 
echo preg_replace('~%(\w+)%~e', '$obj->$1', $str); 
Questions connexes