2012-03-09 10 views
2

単純なテンプレートパーサーの場合は、$00$11などがHTMLに表示され、削除されています。私は10ドルが交換から取り除かれる原因となっている私のパターンに何があるかはわかりません。

奇妙なことは、タグを処理するメインのpreg_replace関数を除いて、ほとんどすべてのコードをコメントアウトしたことです。外見上、接続はありませんが、ほとんどすべてが削除されています。

機能(コメントアウトされているものが表示されない):

public function output() { 
    $output = file_get_contents($this->file); 

    foreach ($this->values as $key => $value) { 
     $dynamic = preg_quote($key); 
     $pattern = '%\[@'.$dynamic.'.*?\]%'; 
     $output = preg_replace($pattern, $value, $output);  

     if ($key == 'objective') { 
      $objective = $value; 
     } 
    } 
} 

HTML抜粋

: '客観的'(すなわち、 $value)の

[if @objective]<div id="objective">[@objective]</div>[/if] 

オリジナル値

$ words $ 100!100は、私のマネジメントスキル、品質保証、プログラム開発、およびトレーニング経験を最大限にするXYZ Companyの役職を得ます。

'目的' の新しい値:

$言葉0 100は私の管理能力、品質保証、プログラム開発、およびトレーニングの経験を最大限XYZ Companyの位置を取得します!。

+0

あなたの質問は何を付加することでドル記号を保護しますか? – Madbreaks

+3

'$ xx'(' x'は数字)は、 'preg_replace'の置換文字列の後方参照に使用されます。おそらくそれはそれと関係がありますか? '$ value'が何であるか知らなくても、実際には分かりません。 –

+0

@Madbreaks - なぜそれが起こっているのですか?この交換は望ましくありません。 – jsuissa

答えて

2

(フォローアップの質問にコメントする。)

$xxpreg_replaceの置換文字列内の後方参照のために使用されている(xが数字である場合)。あなたが$xxを格納するための置換文字列をしたい場合は、それをエスケープする必要があります。

$value = preg_replace('/\\$\\d+/', '\\\\$0', $value); 

これは$value\$xx$xxに置き換えられます。

+0

ありがとう。それは魅力のように働いた。逆参照での読み上げになりました。 – jsuissa

1

これが原因preg_replaceで起こっている、置換文字列$<number>は、「パターン内番目のキャプチャブラケットと交換してください」という意味。

PHPに '$'記号を無視するように指示する必要があります。私はあなたが2段階のプロセスでこれを行う必要があると思う:

  1. str_replace("$","\\\$",$output); - これはバックスラッシュ
  2. preg_replace($pattern,$value,$output);
関連する問題