2009-06-12 14 views
1

einfach wirklich, ich habe einen regulären Ausdruck geschrieben, um Tags mit PHP-Konstanten aus einem HTML-Snippet zu finden und zu ersetzen. Meine Lösung, die funktioniert, fühlt sich einfach nicht richtig an. Wie kann das verbessert werden?kann dieser reguläre Ausdruck gefunden/ersetzt werden?

preg_match_all('/\{CONSTANT_(.*)\}/', $final, $result, PREG_PATTERN_ORDER); 
      for ($i = 0; $i < count($result[1]); $i++) { 
       $final = str_replace($result[0][$i], constant($result[1][$i]),$final); 
      } 
+0

bekommen Haben Sie nicht ein '?' In Ihrem '(. *)'? (dh sollte '(. *?) \}' sein oder den Modifizierer U/PCRE_UNGREEDY verwenden, siehe http://www.php.net/manual/en/regexp.reference.php#regexp.reference.internal-options) Ich denke, Sie führen eine gierige Suche durch, wenn Sie also "{CONSTANT_c1} {CONSTANT_c2}" 'haben, würde die' (. *) 'Einfangende Gruppe" 'c1} {CONSTANT_c2" 'entsprechen. –

Antwort

1

Sie alles auf einen Schlag mit preg_replace_callback zu tun habe ich gemacht, die .* nicht gierig mit .*?, hat dies die Effekt der Sicherstellung, dass es nicht essen geht} wenn ein längeres Spiel möglich ist. Sie könnten den gleichen Effekt mit ([^}]*), oder noch besser, ([a-zA-Z0-9_]+)

+0

Ja, das sieht genau so aus, wie ich eigentlich brauche. wirkt eleganter und effizienter – robjmills

+0

"[^}]} +" ist sogar besser als "(. *?) \}" – Tomalak

0

Ich bin immer gegen das Rad neu zu erfinden: Wenn Sie irgendeine Art von Template-Engine (die PHP bereits ist) einen Blick auf Smarty.

+0

das ist wahr, aber die Implementierung von Smarty scheint einfach übertrieben für diese Nutzung und vermutlich kommt es mit seinem eigenen inhärenten Overhead sowieso – robjmills

0

Was

mixed preg_replace (mixed $pattern , mixed $replacement , mixed $subject [, int $limit= -1 [, int &$count ]])

?

0

Seien Sie vorsichtig bei der Verwendung von ".*" in einem regulären Ausdruck, da es gierig alles passt, was es findet. Zum Beispiel in der folgenden Zeile:

{CONSTANT_ONE} blah {CONSTANT_TWO} 

Der obige reguläre Ausdruck die Zeichenfolge erfassen „ONE} blah {CONSTANT_TWO

könnten Sie eine Zeichenklasse verwenden statt. passend nichts außer einem „}“ Charakter:

function getConstant($matches) 
{ 
    return constant($matches[1]); 
} 
$final=preg_replace_callback(
      '/\{CONSTANT_(.*?)\}/', 
      "getConstant", 
      $final); 

Hinweis

/\{CONSTANT_([^}]*)\}/ 
+0

good point! Danke für die heads up – robjmills

+0

Sicher könnten Sie nur den nicht gierigen Operator in einem Preg, z. . *? –

Verwandte Themen