Проблема, с которой вы сталкиваетесь, заключается в том, что второй фильтр переопределит первый в стеке фильтров ($this->_filters
), определенных в Zend_Form_Element.
Как отметил Дэвид в комментариях к вопросу, в стеке фильтров в качестве индекса используются имена фильтров ($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, в отличие от ответа Марцина (синтаксис неверен), вы все равно можете сделать это следующим образом:
$element->addFilter('pregReplace', array(
array('match' => array('/bob/', '/sam/'),
'replace' => array('john', 'dave')
)));
Это должно сработать;)