2011-07-15 46 views
9

我希望能夠在單個Zend表單元素上添加多個PregReplace過濾器。 我可以使用下面的代碼添加一個PregReplace過濾:在Zend表單元素上使用多個PregReplace過濾器

$word = new Zend_Form_Element_Text('word'); 
$word->addFilter('PregReplace', array(
     'match' => '/bob/', 
     'replace' => 'john' 
    )); 
$this->addElement($word); 

我已經試過

$word = new Zend_Form_Element_Text('word'); 
$word->addFilter('PregReplace', array(
     'match' => '/bob/', 
     'replace' => 'john' 
    )); 
$word->addFilter('PregReplace', array(
     'match' => '/sam/', 
     'replace' => 'dave' 
    )); 
$this->addElement($word);  

但這恰恰意味着只有第二過濾器的工作。

如何添加多個PregReplace過濾器?

+0

'addFilter()方法'使用類名作爲內部的註冊表項,所以顯然你不能有相同的CLA的多個過濾器SS。令人驚訝的是,它不允許指定密鑰的選項。也許值得提交作爲一個問題。 –

回答

1

由於PregReplace使用PHP的preg_replace功能,我想這樣的事情是可能的(可以preg_replace函數接受的模式和相應的替換字符串數組數組):

$word = new Zend_Form_Element_Text('word'); 
$word->addFilter('PregReplace', array(
     'match' => array('/bob/', '/sam/'), 
     'replace' => array('john' , dave) 
    )); 
$this->addElement($word); 

我沒有,雖然進行了測試。希望它能起作用。

+1

感謝Marcin,不幸的是,這沒有奏效。 我收到錯誤'Zend_Filter_PregReplace沒有有效的MatchPattern集' – AndySidd

+0

所以我們可以做什麼?!這也是我的問題! – afsane

0

我無法得到前面的例子與'PregReplace'一起工作。我轉而用新的Zend_Filter_PregReplace()來調用它。現在它適用於我。

$word->addFilter(new Zend_Filter_PregReplace(array(
       'match' => array('/bob/', '/sam/'), 
       'replace'=> array('john', 'dave')) 
)); 
+0

我做了同樣的工作,但它顯示我這個錯誤:「警告:preg_replace()[function.preg-replace]:分隔符不能是字母數字或反斜槓」當我運行每個篩選器分離它們工作正常沒有錯誤! – afsane

6

你面對的問題是,第二過濾器將覆蓋在Zend_Form_Element的定義的過濾器堆棧($this->_filters)的第一個。

正如David在問題評論中提到的,過濾器堆棧使用過濾器名稱作爲索引($this->_filters[$name] = $filter;),這就是第二個過濾器重寫第一個過濾器的原因。

爲了解決這個問題,你可以按如下方式使用自定義過濾器:

$element->addFilter('callback', function($v) { return preg_replace(array('/bob/', '/sam/'),array('john', 'dave'), $v); }); 

這使用內聯函數()做,如果你不使用PHP版本5.3或高,你可以設置你的回調如下,使其工作:

$element->addFilter('callback', array('callback' => array($this, 'funcName'))); 

而且在你init()方法在表單中添加:

function funcName($v) { 
    return preg_replace(array('/bob/', '/sam/'), array('john', 'dave'), $v); 
} 

最後,如果你想只使用PregReplace過濾,不像馬辛的答案(語法是不正確的),你仍然可以這樣來做:

$element->addFilter('pregReplace', array(
      array('match' => array('/bob/', '/sam/'), 
       'replace' => array('john', 'dave') 
))); 

這應該做的伎倆;)

+0

我們不能定義這樣的功能!它顯示錯誤! – afsane

+0

什麼樣的錯誤?儘管這是一個正確的PHP5語法。 – Liyali

+0

意外的功能 – afsane

-1

我一直在尋找同樣的反應沒有一個可用的版本

$word->addFilter(new Zend_Filter_PregReplace(new Zend_Config(array(
'match'=>array('/bob/', '/sam/'), 
'replace'=>array('john', 'dave') 
)))); 
+0

請僅使用英語發佈annswer。 –

相關問題