2011-04-01 58 views
1

下面的代碼不是一個正在運行的方法,它只是爲了幫助您理解我正在嘗試做的事情而編寫的。php:dynamic preg_replace

 

// $i = occurrence to replace 
// $r = content to replace 

private function inject($i, $r) { 
     // regex matches anything in the format {value|:value} 
     $output = preg_replace('/\{(.*?)\|\:(.*?)\}/', '$r', $this->source); 
     $output[$i] 
} 
 

如何在$ output中找到$ i事件;並用$ r替換它;?

注意:我想要做的就是使用$ i(這是一個數字)在preg_replace中查找該nmber的出現次數;對於〔實施例:我可能要與變量$ R

+0

$ i是否包含要查找的正則表達式或字符串? – willm1 2011-04-01 21:58:49

+0

什麼是$ i?整個模式?需要更多的細節。 – Mario 2011-04-01 21:59:31

+0

匹配項目的發生次數。 $ i例如可能是1,那麼,正則表達式需要找到1次出現並用$ r替換; – kr1zmo 2011-04-01 22:00:07

回答

1

我想你只能做到這樣的occurence有回調計數更換的preg_replace模式的第二次出現:

private function inject($i, $r) { 
     $this->i = $i; 
     $this->r = $r; 

     // regex matches anything in the format {value|:value} 
     $output = preg_replace_callback('/\{(.*?)\|\:(.*?)\}/', 
       array($this, "inject_cb"), $this->source); 
} 

function inject_cb($match) { 
    if ($this->i --) { 
     return $match[0]; 
    } 
    else { 
     return $this->r; 
    } 
} 

它留下的第一$i按原樣匹配,並在倒數匹配時使用暫存$this->r。可以通過關閉來完成,以避免->$i->$r

+0

似乎無法得到此結果?我相信這可能是我的錯誤。 – kr1zmo 2011-04-01 22:19:39

+0

它仍然需要用$輸出做些事情。這個任務的一個替代選擇可能是'preg_split',而'PREG_SPLIT_DELIM_CAPTURE'可能(但更復雜)。 – mario 2011-04-01 22:24:36

+0

我認爲這兩個函數需要被封裝在一個類中(作爲方法)才能工作。 – ridgerunner 2011-04-02 05:59:17