2010-12-16 3 views
4

je un tableau:PHP - éléments preg_replace entre parenthèses avec des éléments du tableau

array('id' => 'really') 

J'ai une chaîne:

$string = 'This should be {id} simple.'; 

Je veux finir avec:

This should be really simple. 

J'ai une expression régulière qui fonctionnera avec l'aspect {id}, mais j'ai du mal à faire ce que je veux. {Id} peut être n'importe quoi, {foo} ou {bar} ou tout ce qui correspond à mon expression régulière.

Je suis sûr qu'il y a une solution simple qui m'échappe pour le moment.

Merci,

Justin

Répondre

5

str_replace est plus rapide que preg_replace, essayez ceci:

$arr = array('a' => 'a', 'b' => 'b'); 
$str = "{a} {b} {c}"; 
$values = array_values($arr); 
$keys = array_keys($arr); 

foreach ($keys as $k => $v) { 
    $keys[$k] = '{'.$v.'}'; 
} 

str_replace($keys, $values, $str); 
+0

Ceci est vrai, mais $ arr (dans votre exemple) pourrait avoir des centaines de paires clé/valeur, je me demande si votre solution serait encore plus rapide. Merci. – manumoomoo

+0

peut-être que vous pouvez construire le $ arr de manière à ce qu'il contienne directement les '{' et '}? alors vous n'avez pas besoin de la boucle supplémentaire. Mais peu importe..c'est toujours O (n) ;-) Si vous n'avez pas besoin de règles de remplacement, vous devriez toujours utiliser cette fonction à la place de ereg_replace() ou preg_replace(). voir: http://php.net/manual/en/function.str-replace.php – Stuck

0

preg_replace_callback a une option de rappel qui font ce genre de choses possibles.

function replaceText($matches){ 
    global $data; 
    return $data[$matches[1]]; 
} 
preg_replace_callback(
     '/{([a-zA-Z\_\-])*?}/i', 
     'replaceText', 
     $content 
); 

Si vous ne souhaitez pas utiliser la variable globale créer une classe et d'utiliser la notation de rappel array($object, 'method').

+0

Merci. J'ai oublié preg_replace_callback. – manumoomoo

4

Vous pouvez utiliser le preg_replace avec modificateur e comme:

$string = preg_replace('/{([a-zA-Z\_\-]*?)}/ie','$arr["$1"]',$string); 

Ideone Link

En utilisant le modificateur e vous pouvez avoir une PHP expression dans le remplacement par t de preg_replace.

Maintenant, pourquoi votre regex /{([a-zA-Z\_\-])*?}/i ne fonctionne pas?

Vous avez placé *? à l'extérieur de la parenthèse de capture (). Vous ne capturez donc que le premier caractère du mot trouvé dans { }.

Notez également que vous ne l'avez pas échappé { et } qui sont regex méta-caractères utilisé pour spécifier une plage de quantificateurs {num}, {min,max}. pas besoin de pour leur échapper, car le moteur regex peut déduire du contexte que { et } ne peuvent pas être utilisés comme opérateur de plage car ils n'ont pas de nombres dans le format requis à l'intérieur d'eux et les traite donc littéralement.

+0

merci pour les mises à jour de mon regex et les autres conseils utiles. Erreur stupide vraiment. Merci encore. – manumoomoo

+0

Le modificateur est [obsolète] (http://php.net/manual/fr/reference.pcre.pattern.modifiers.php) à partir de la version 5.5 – kodeart

Questions connexes