【问题标题】:Using multiple PregReplace filters on a Zend Form element在 Zend Form 元素上使用多个 PregReplace 过滤器
【发布时间】:2011-07-15 10:06:15
【问题描述】:

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

【问题讨论】:

  • addFilter() 使用类名作为内部注册表项,因此显然您不能拥有同一类的多个过滤器。有点令人惊讶的是它不允许指定密钥的选项。也许值得作为一个问题提交。

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


【解决方案1】:

您面临的问题是第二个过滤器将覆盖 Zend_Form_Element 中定义的过滤器堆栈 ($this->_filters) 中的第一个过滤器。

正如大卫在问题 cmets 中提到的,过滤器堆栈使用过滤器名称作为索引 ($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')
)));

这应该可以解决问题;)

【讨论】:

  • 我做到了,它显示了这个错误:警告:preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash。 php 版本为 PHP 5.3.1
  • 我的猜测是你的模式有问题。你能在这里发布你的代码吗?我刚刚在示例中尝试了我的代码,它运行良好。
  • 好答案,IMO $element->addFilter('PregReplace', array(array('match' => array(), 'replace' => array()))); 是解决这个问题的最佳方式。
  • 这是我的代码$explain = new Zend_Form_Element_Textarea('explain'); $explain -> setLabel('explain') ->addFilter('callback', array('callback' => array($this, 'mypregReplace'))) ->setValue($data['explain']) ->addDecorator('HtmlTag', array('tag' => 'div'));
  • 这是我在那个类中的函数 ` public function mypregReplace($v) { return preg_replace( array("%script/uploaded%" , "http://".$_SERVER['HTTP_HOST '] . '/public/script/uploaded'), array( "[\.\./]" , ""), $v); }` 它显示此错误 **警告:preg_replace() [function.preg-replace]:分隔符不能是字母数字或反斜杠 **
【解决方案2】:

由于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);

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

【讨论】:

  • 谢谢 Marcin,很遗憾这没有用。我收到错误“Zend_Filter_PregReplace 没有有效的 MatchPattern 集”
【解决方案3】:

我无法让前面的示例与“PregReplace”一起使用。我改为使用 new Zend_Filter_PregReplace() 调用它。它现在对我有用。

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

【讨论】:

  • 我做了同样的工作,但它向我显示了这个错误:“警告:preg_replace() [function.preg-replace]:分隔符不能是字母数字或反斜杠”当我运行每个过滤器时,它们可以工作很好,没有错误!
【解决方案4】:

我正在寻找相同响应没有可用版本

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

【讨论】:

  • 请仅以英文发布答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多