2012-07-18 116 views
0

我有一個函數,它使用preg_replace()其中模式和替換是數組。我需要一個計數器來跟蹤替換,所以我將函數轉換爲使用preg_replace_callback和閉包,但我似乎無法找到一種方法來區分傳遞到回調匹配的匹配模式。有沒有辦法使用preg_replace_callback做array =>數組替換?preg_replace_callback數組模式和替換

理想的情況下,這是想我的工作,但顯然它不會因爲$模式,$替代評估進入呼叫,並且其間沒有每次更換

function replaceTags($text) 
{ 
    $i = 1; 

    $pattern = array(
     '/\[d\](.*?)\[\/d\]/', 
     '/\[s\](.*?)\[\/s\]/', 
    ); 

    $replace = array(
     '<div id="'.($i++).'">$1</div>', 
     '<span id="'.($i++).'">$1</span>', 
    ); 

    return preg_replace($pattern, $replace, $text); 
} 
+0

['preg_replace'](http://us2.php.net/manual/en/function.preg-replace.php)已經支持array - >數組替換。它不符合你的需求嗎? – 2012-07-18 01:45:15

+0

我需要一個更換櫃檯用於更換本身,所以preg_replace不會工作 – flurry 2012-07-18 01:47:56

+0

您可以採取簡單的方法,並單獨計數和替換。 – 2012-07-18 01:49:55

回答

0

如果我理解正確的話,你只需要在你的回調函數的調用之間保持狀態。完成此操作的理想方法是使用成員函數。狀態存儲在對象實例中。每次打電話時,都可以修改對象,改變你的狀態。

我還爲您的模式添加了額外的捕獲,以區分回調中的模式。

<?php 
class TagReplacer { 
    private $counter = 0; 

    public function replacer($matches) { 
     // modify the state 
     $this->counter++; 

     // return the replacement text using the state 
     if ($matches[1] === "d") 
      $tag = 'div'; 
     else 
      $tag = 'span'; 
     return "<{$tag} id=\"{$this->counter}\">{$matches[2]}</{$tag}>"; 
    } 
} 

function replaceTags($text) { 
    $stateObject = new TagReplacer(); 
    $patterns = array(
     '/\[(d)\](.*?)\[\/d\]/', 
     '/\[(s)\](.*?)\[\/s\]/', 
    ); 

    return preg_replace_callback(
      $patterns, 
      array(&$stateObject, "replacer"), 
      $text); 
} 

echo replaceTags("zzz[d]123[/d]zzz[s]456[/s]zzz[d]78[/d]zzz[s]90[/s]zzz"); 
?> 

輸出是

zzz<div id="1">123</div>zzz<span id="3">456</span>zzz<div id="2">78</div>zzz<span id="4">90</span>zzz 

我很驚訝的是,ID不按數字順序排列。我的猜測是,preg_replace_callback遍歷模式數組,對每個模式一次執行所有替換。

+0

是的,這是我想要做的,但我的模式和替換參數是數組。如果說明了這一點,我會在這個問題上增加一個例子。 – flurry 2012-07-18 04:59:14

+0

@Slipflurry這是你要找的更多嗎? – walrii 2012-07-18 06:25:29