1、简介
Zend_Filter 组件提供了一系列普遍使用的数据过滤器(data filter),同时也提供了一个简单的过滤器链机制,使多个过滤器以用户定义的顺序对一个单一的数据进行过滤。
1.1什么是过滤器(filter)
在现实世界中,过滤器被用来过滤掉输入物中不需要的部分,并期望产出部分输出物(比如,咖啡)。在这样的情景下,过滤器就像是一个操作员,生产出输入物的子集。这种类型的过滤对Web应用程序来说是很有用的-移除非法的输入数据,去除不必要的空格,等等。
这个过滤器基本的定义,可延伸出包括一般化的输入数据的转化。HTML 实体的转义,是Web应用程序中一个普遍的转化。例如,一个表单字段的值附带着不受信任的数据(比如,来自web浏览器的数据),为了防止不期望的行为发生和安全漏洞,这个值应该不包括 HTML 实体,或只包含已转义的 HTML 实体。为了满足这个需求,输入数据中的 HTML 实体被移除或被转义,当然,这得视具体情况而定。过滤器的第一种定义中就涵盖了过滤器移除 HTML 实体的意思-操作员生产出输入数据的一个子集。然而,过滤器也可转义 HTML 实体,转化输入数据(比如,"&
" 被转义成 "&
")。为 Web 开发者支持这样的用例是非常重要的,且在使用Zend_Filter的上下文中,”to filter”的意思是对输入数据执行一些转化。
1.2过滤器的基本用法
确立了这样的过滤器定义,为 Zend_Filter_Interface
接口奠定了理论基础,需要过滤器类实现一个名为 filter()
的方法。
下面一个简单的例子,示范了在2个输入数据上使用过滤器,"&
" 符号和双引号 ("
) 字符:
$htmlEntities = new Zend_Filter_HtmlEntities(); echo $htmlEntities->filter('&'); // & echo $htmlEntities->filter('"'); // "
1.3使用静态 get() 方法
如果不方便加载给定的过滤器类和创建过滤器的实例,可以使用静态方法 Zend_Filter::get()
作为备用的调用风格。
这个方法的第一个参数是数据输入值,将传递给 filter()
方法,第二个参数是个字符串,对应于过滤器类的基本名,和 Zend_Filter 名称空间有关。get()
方法自动加载这个类,创建一个实例,并应用 filter()
方法给数据输入。
echo Zend_Filter::get('&', 'HtmlEntities');
如果过滤器类需要,也可以传递一个数组构造参数
echo Zend_Filter::get('"', 'HtmlEntities', array(ENT_QUOTES));
静态用法对调用过滤器特别方便,但如果对多个输入运行过滤器,按上面第一个例子做更有效,创建一个过滤器对象的实例并调用它的 filter()
方法。
并且,Zend_Filter_Input 类允许初始化和运行多重过滤器,按需的校验器类来处理输入数据,参见 Zend_Filter_Input。
2、标准过滤器类
Zend Framework 带有一组标准的过滤器。
2.1Alnum
返回只保留字母和数字的字符串 $value
,这个过滤器包括一个允许空白字符的选项。
2.2Alpha
返回只保留字母的字符串 $value
,这个过滤器包括一个允许空白字符的选项。
2.3BaseName
给定包含一个文件的路径字符串,这个过路器将返回这个文件的基本名(base name)。
2.4Digits
返回只保留数字的字符串 $value
。
2.5Dir
返回路径的名字部分。
2.6HtmlEntities
返回转换成它们对应 HTML 实体的字符串 $value
。
2.7Int
返回整数 $value
。
2.8StripNewlines
返回不带任何新行控制符的字符串 $value
。
2.9RealPath
扩展所有符号的链接和解析指向在输入路径里的 '/./', '/../' 和额外的 '/' 字符并且返回规范化后的绝对路径名,返回的结果路径将没有符号链接 '/./' 或 '/../' 部分。
如果失败,例如文件不存在,Zend_Filter_RealPath
将返回 FALSE
。在 BSD 系统,如果只有路径最后部分不存在, Zend_Filter_RealPath
不会失败,但其它系统返回 FALSE
。
2.10StringToLower
返回按需转换字母成小写的字符串 $value
。
2.11StringToUpper
返回按需转换字母成大写的字符串 $value
。
2.12StringTrim
返回从头到尾整理过的字符串 $value
。
2.13StripTags
返回把 HTML 和 PHP 标签已剥离的(声明为允许的标签不会剥离)输入的字符串。除了能指定允许哪个标签,开发者也可以在所有允许的标签(或只对特定的标签)中指定哪个属性被允许。最后,这个过滤器提供控制是否注释(如 <!-- ... -->
)被删除或允许。
3、过滤器链
通常,多个过滤器可以以一个特定的顺序应用到某个值上。例如,登录表单的用户名,应为英文字符且小写。
Zend_Filter
提供了一个简单的方法,使过滤器可以链接在一起。下面的代码描述了怎样把2个过滤器链接起来且应用到提交上来的用户名值上:
// Create a filter chain and add filters to the chain $filterChain = new Zend_Filter(); $filterChain->addFilter(new Zend_Filter_Alpha()) ->addFilter(new Zend_Filter_StringToLower()); // Filter the username $username = $filterChain->filter($_POST['username']);
Zend_Filter
中去的顺序依次执行。上面的例子中,用户名首先被移除任何非英文字母的字符,然后将所有大写字符转化为小写字符。
任何实现了Zend_Filter_Interface
接口的,都可被添加到过滤器链中。
4、编写过滤器
Zend_Filter提供了一系列常用的过滤器,但是开发者经常需要为他们特殊的用例编写定制的过滤器。编写定制的过滤器很容易,只要实现Zend_Filter_Interface
接口。
Zend_Filter_Interface
接口定义了一个方法filter()
,可被用户的类实现。使用Zend_Filter::addFilter()
方法,可以把一个实现了这个接口的对象添加到过滤器链中。
下面的例子,示范了怎样编写一个定制的过滤器:
class MyFilter implements Zend_Filter_Interface { public function filter($value) { // perform some transformation upon $value to arrive on $valueFiltered return $valueFiltered; } }
添加上述过滤器的实例到过滤器链中:
$filterChain = new Zend_Filter(); $filterChain->addFilter(new MyFilter());