在Zend Form元素上使用多个PregReplace过滤器

时间:2011-07-15 10:06:15

标签: php zend-framework zend-form zend-filter

我希望能够在单个Zend Form元素上添加多个PregReplace过滤器。 我可以使用以下代码添加一个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过滤器?

4 个答案:

答案 0 :(得分: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过滤器,不像Marcin的回答(语法不正确),你仍然可以这样做:

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

应该这样做;)

答案 1 :(得分: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);

我还没有测试过它。希望它会奏效。

答案 2 :(得分:0)

我无法让上一个示例与'PregReplace'一起使用。我转而使用新的Zend_Filter_PregReplace()来调用它。它现在对我有用。

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

答案 3 :(得分:-1)

我一直在寻找同样的回复没有可用的版本

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