2011-02-19 4 views
3

J'ai besoin d'aide pour trouver une expression régulière. Dans mon script j'ai une certaine ligne avec des espaces réservés. Ce que je veux faire est que je veux envoyer à chaque espace réservé un texte une fonction qui le traduit à ce qu'il devrait être.PHP preg_replace regex question

E.g. mon texte est:

Lorem ipsum dolor sit {{}} AMETPLACEHOLDER, consectetur adipiscing elit.

Je veux que le texte AMETPLACEHOLDER à envoyer de ma fonction translateMe.

Je suis vraiment mauvais en regex mais je l'ai essayé de toute façon. Je n'obtiens pas plus loin que ceci:

$sString = preg_replace("(*.?)/\{{(*.?)}}(*.?)/", $this->echoText('\\2'), $sString); 

Qui bien sûr ne fonctionne pas.

Quelqu'un peut-il m'aider?

Br, Paul Peelen

Répondre

5

En utilisant preg_replace_callback, vous pouvez spécifier une méthode comme ceci:

= preg_replace_callback("@{{(.*?)}}@", array($this, "echoText"), $txt) 

Et la méthode pourrait être:

public function echoText($match) { 
    list($original, $placeholder) = $match; // extract match groups 
    ... 
    return $translated; 
} 

BTW, pour concevoir des expressions régulières, consultez http://regular-expressions.info/ ou certains des outils répertoriés dans: https://stackoverflow.com/questions/89718/is-there-anything-like-regexbuddy-in-the-open-source-world

+0

Thnx. Cela a fonctionné parfaitement. Quand j'aurai le temps, je vérifierai vos liens. Devrait vraiment y aller avec regex. –

4

Vous devez utiliser le modificateur /e pour analyser le remplacement eval, ou utiliser preg_replace_callback().

par ex.

$sString = preg_replace("#\{\{(*.?)\}\}#e", 'echoText("$2")', $sString); 

Mais le $this causera des problèmes là-bas, si vous utilisez 5.3+, vous pouvez utiliser une fermeture pour créer une fonction pour faire face à cela, ou créer un rappel:

$sString = preg_replace_callback("#\{\{(*.?)\}\}#", array($this, 'echoText'), $sString); 

$this->echoText() aurait être modifié pour attraper le tableau de correspondance plutôt que la chaîne dans ce cas.

Ou avec une fonction anonyme:

$sString = preg_replace_callback("#\{\{(*.?)\}\}#", function ($matches) { 
       return $this->echoText($matches[1]); 
      }, $sString);