Io ho scritto una regexp, ma con PHP devi sempre distinguere i casi, cioè: {valore}, {dato}valore{/dato} e {dato|valore1}valore{/dato}:
Codice PHP:
<?php
$string = '{valore}'; // o {dato}valore{/dato} o {dato|valore1}valore{/dato}
preg_match('/^\{(\w+)(?:\|(\w+))?\}(?(1)(.+?)\{\/\\1\})?$/', $string, $m);
// ecco come puoi distinguere i casi:
$m2 = empty($m[2]);
$m3 = empty($m[3]);
if($m2 && $m3) { // {valore}
// $m[1] = valore
// ...
} else if($m2 && !$m3) { // {dato}valore{/dato}
// $m[1] = dato
// $m[3] = valore
// ...
} else if(!$m2 && !$m3) { // {dato|valore1}valore{/dato}
// $m[1] = dato
// $m[2] = valore1
// $m[3] = valore
// ...
}
?>