我希望能够在单个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过滤器?
答案 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')
))));