2012-03-09 82 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摘錄

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

的 '客觀'(即$value)原值

在XYZ公司獲得一個職位,其中$ 100/100美元最大化我的管理技能,質量保證,程序開發和培訓經驗。 !

在XYZ公司獲得一個位置$字0 100最大限度地提高我的管理能力,質量保證,程序開發,培訓經歷:

的 '客觀'新價值。

+0

你的問題是保護美元的跡象? – Madbreaks 2012-03-09 02:54:02

+3

'$ xx'(其中'x'是一個數字)用於替換preg_replace字符串中的反向引用。也許它與此有關?如果不知道「$ value」是什麼,就無法真正知道。 – 2012-03-09 02:54:45

+0

@Madbreaks - 問題是爲什麼會發生,這種替換是不希望的。 – jsuissa 2012-03-09 02:55:45

回答

2

(跟進的問題發表評論。)

$xx(其中x是一個數字)用於在preg_replace替換字符串反向引用。如果你想替換字符串包含$xx,你要逃避它:

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

這將在$value取代$xx通過\$xx

+0

謝謝了。它像一個魅力。現在去閱讀後面的參考文獻。 – jsuissa 2012-03-09 03:07:32

1

發生這種情況,因爲preg_replace$<number>替換字符串裝置「與「第圖案內捕獲托架替換」。

您必須告訴PHP忽略'$'符號。我認爲你必須這樣做的過程分爲兩個步驟:

  1. str_replace("$","\\\$",$output); - 這在前面加上一個反斜槓
  2. preg_replace($pattern,$value,$output);