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过滤器?
您遇到的问题是第二个过滤器将覆盖$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)
这应该够了吧 ;)
由于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)
不过我还没有测试过。希望它能起作用。
| 归档时间: |
|
| 查看次数: |
3334 次 |
| 最近记录: |