第 20 章 Zend_Filter

目录

20.1. 简介
20.1.1. 什么是过滤器(filter)?
20.1.2. 过滤器的基本用法
20.1.3. 使用静态 get() 方法
20.2. 标准过滤器类
20.2.1. Alnum
20.2.2. Alpha
20.2.3. BaseName
20.2.4. Digits
20.2.5. Dir
20.2.6. HtmlEntities
20.2.7. Int
20.2.8. StripNewlines
20.2.9. RealPath
20.2.10. StringToLower
20.2.11. StringToUpper
20.2.12. StringTrim
20.2.13. StripTags
20.3. 过滤器链
20.4. 编写过滤器
20.5. Zend_Filter_Input
20.5.1. 声明过滤器和校验器规则
20.5.2. 生成过滤器和校验器的处理器
20.5.3. 获取校验过的字段和其它报告
20.5.3.1. 输入值有效的查询
20.5.3.2. 获得无效、丢失或未知的字段
20.5.3.3. 获得有效字段
20.5.4. 使用 Metacommands 来控制过滤器或校验器规则
20.5.4.1. The FIELDS metacommand
20.5.4.2. The PRESENCE metacommand
20.5.4.3. The DEFAULT_VALUE metacommand
20.5.4.4. The ALLOW_EMPTY metacommand
20.5.4.5. The BREAK_CHAIN metacommand
20.5.4.6. The MESSAGES metacommand
20.5.4.7. 对所有的规则使用选项来设置 metacommands
20.5.5. 添加过滤器类命名空间
20.6. Zend_Filter_Inflector
20.6.1. 操作
20.6.2. 设置到预备的过滤器的路径
20.6.3. 设置变形器目标
20.6.4. 变形规则
20.6.4.1. 静态规则
20.6.4.2. 过滤变形器规则
20.6.4.3. 一次设置多个规则
20.6.5. 实用方法
20.6.6. 对 Zend_Filter_Inflector 使用 Zend_Config

20.1.  简介

Zend_Filter 组件提供了一系列普遍使用的数据过滤器(data filter),同时也提供了一个简单的过滤器链机制,使多个过滤器以用户定义的顺序对一个单一的数据进行过滤。

20.1.1.  什么是过滤器(filter)?

在现实世界中,过滤器被用来过滤掉输入物中不需要的部分,并期望产出部分输出物(比如,咖啡)。在这样的情景下,过滤器就像是一个操作员,生产出输入物的子集。这种类型的过滤对Web应用程序来说是很有用的-移除非法的输入数据,去除不必要的空格,等等。

这个过滤器基本的定义,可延伸出包括一般化的输入数据的转化。HTML 实体的转义,是Web应用程序中一个普遍的转化。例如,一个表单字段的值附带着不受信任的数据(比如,来自web浏览器的数据),为了防止不期望的行为发生和安全漏洞,这个值应该不包括 HTML 实体,或只包含已转义的 HTML 实体。为了满足这个需求,输入数据中的 HTML 实体被移除或被转义,当然,这得视具体情况而定。过滤器的第一种定义中就涵盖了过滤器移除 HTML 实体的意思-操作员生产出输入数据的一个子集。然而,过滤器也可转义 HTML 实体,转化输入数据(比如,"&" 被转义成 "&")。为 Web 开发者支持这样的用例是非常重要的,且在使用Zend_Filter的上下文中,”to filter”的意思是对输入数据执行一些转化。

20.1.2.  过滤器的基本用法

确立了这样的过滤器定义,为 Zend_Filter_Interface 接口奠定了理论基础,需要过滤器类实现一个名为 filter() 的方法。

下面一个简单的例子,示范了在2个输入数据上使用过滤器,"&" 符号和双引号 (") 字符:

$htmlEntities = new Zend_Filter_HtmlEntities();

echo $htmlEntities->filter('&'); // &
echo $htmlEntities->filter('"'); // "

            

20.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 类允许初始化和运行多重过滤器,按需的校验器类来处理输入数据,参见 第 20.5 节 “Zend_Filter_Input”