2009-06-12 8 views
1

本当に簡単なことですが、HTMLスニペットの中のphp定数でタグを見つけて置き換える正規表現を書いています。私の解決策は、うまくいきません。どのように改善することができますか?この正規表現の検索/置換は最適化できますか?

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

'?() 'に'?'が足りないのですか? (すなわち '(。*?)\}'でなければなりません)、またはU/PCRE_UNGREEDY修飾子を使用してください(http://www.php.net/manual/en/regexp.reference.php#regexp.reference.internal-optionsを参照) 私はあなたが貪欲な検索をしていると思うので、 '' {CONSTANT_c1} {CONSTANT_c2} ''があれば、 '。*)'の捕捉グループは '' c1} {CONSTANT_c2 "'と一致します。 –

答えて

1

を、これは持っていますより長いマッチが可能な場合、それを食べないようにする効果。 ([^}]*)と同じ効果が得られるかもしれません。([a-zA-Z0-9_]+)

+0

ええ、それは私が実際に必要なもののように見えます。よりエレガントで効率的なようです – robjmills

+0

"[^}]}"は "(。*?)\}よりも優れています" – Tomalak

0

私は車輪の再発明に対して常にだ:あなたは(PHPがすでにある)テンプレートエンジンのいくつかの並べ替えが必要な場合Smartyを見てみましょう。

+0

これは当てはまりますが、Smartyを実装することは、この使用法のために残忍なように思えますし、とにかくそれ自身の固有のオーバーヘッドが付属するでしょう – robjmills

0

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

は?

0

正規表現で ".*"を使用する場合は、見つかったものすべてに貪欲に対応するように注意してください。たとえば、次の行に:

{CONSTANT_ONE} blah {CONSTANT_TWO} 

上記の正規表現は、文字列をキャプチャします「ONE} blah {CONSTANT_TWO

は、あなたの代わりに文字クラスを使用することができます。 「}」文字以外のものと一致する:あなたは、私が.*?.*非貪欲を作ったpreg_replace_callback

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

注意と1本のヒットでそれをすべて行うことができます

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

良い点!ヘッドアップありがとう – robjmills

+0

確かに、プレグでただ欲張りな演算子を使うことができます。 。*? –

関連する問題