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

And*_*idd 9 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);
Run Code Online (Sandbox Code Playgroud)

我试过了

$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);    
Run Code Online (Sandbox Code Playgroud)

但这仅仅意味着第二个过滤器工作.

如何添加多个PregReplace过滤器?

Liy*_*ali 6

您遇到的问题是第二个过滤器将覆盖$this->_filtersZend_Form_Element中定义的过滤器堆栈()中的第一个过滤器.

正如David在问题评论中提到的那样,过滤器堆栈使用过滤器名称作为索引($this->_filters[$name] = $filter;)这就是第二个过滤器覆盖第一个过滤器的原因.

要解决此问题,您可以使用自定义筛选器,如下所示:

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

这是使用内联函数()完成的,如果您没有使用PHP 5.3或更高版本,您可以按如下方式设置回调以使其工作:

$element->addFilter('callback', array('callback' => array($this, 'funcName')));
Run Code Online (Sandbox Code Playgroud)

init()在您的表单中添加您的方法:

function funcName($v) {
    return preg_replace(array('/bob/', '/sam/'), array('john', 'dave'), $v);
}
Run Code Online (Sandbox Code Playgroud)

最后,如果你只想使用PregReplace过滤器,不像Marcin的答案(语法不正确),你仍然可以这样做:

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

这应该够了吧 ;)


Mar*_*cin 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);
Run Code Online (Sandbox Code Playgroud)

不过我还没有测试过。希望它能起作用。