第 14 章 Zend_Filter

目录

14.1. 简介
14.1.1. 什么是过滤器(filter)?
14.1.2. 过滤器的基本用法
14.1.3. 使用静态 get() 方法
14.2. 标准过滤器类
14.2.1. Alnum
14.2.2. Alpha
14.2.3. BaseName
14.2.4. Digits
14.2.5. Dir
14.2.6. HtmlEntities
14.2.7. Int
14.2.8. RealPath
14.2.9. StringToLower
14.2.10. StringToUpper
14.2.11. StringTrim
14.2.12. StripTags
14.3. 过滤器链
14.4. 编写过滤器
14.5. Zend_Filter_Input
14.5.1. Declaring Filter and Validator Rules
14.5.2. Creating the Filter and Validator Processor
14.5.3. Retrieving Validated Fields and other Reports
14.5.3.1. Querying if the input is valid
14.5.3.2. Getting Invalid, Missing, or Unknown Fields
14.5.3.3. Getting Valid Fields
14.5.4. Using Metacommands to Control Filter or Validator Rules
14.5.4.1. The FIELDS metacommand
14.5.4.2. The PRESENCE metacommand
14.5.4.3. The DEFAULT_VALUE metacommand
14.5.4.4. The ALLOW_EMPTY metacommand
14.5.4.5. The BREAK_CHAIN metacommand
14.5.4.6. The MESSAGES metacommand
14.5.4.7. Using options to set metacommands for all rules
14.5.5. Adding Filter Class Namespaces
14.6. Zend_Filter_Inflector
14.6.1. Operation
14.6.2. Setting Paths To Alternate Filters
14.6.3. Setting the Inflector Target
14.6.4. Inflection Rules
14.6.4.1. Static Rules
14.6.4.2. Filter Inflector Rules
14.6.4.3. Setting Many Rules At Once
14.6.5. Utility Methods
14.6.6. Using Zend_Config with Zend_Filter_Inflector

14.1.  简介

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

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

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

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

14.1.2.  过滤器的基本用法

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

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

<?php
require_once 'Zend/Filter/HtmlEntities.php';

$htmlEntities = new Zend_Filter_HtmlEntities();

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

14.1.3.  使用静态 get() 方法

如果不方便加载给定的过滤器类和创建过滤器的实例,可以使用静态方法 Zend_Filter::get() 作为备用的调用风格。这个方法的第一个参数是数据输入值,将传递给 filter() 方法,第二个参数是个字符串,对应于过滤器类的基本名,和 Zend_Filter 名称空间有关。get() 方法自动加载这个类,创建一个实例,并应用 filter() 方法给数据输入。

<?php
require_once 'Zend/Filter.php';

echo Zend_Filter::get('&', 'HtmlEntities');
            

如果过滤器类需要,也可以传递一个数组构造参数

<?php
require_once 'Zend/Filter.php';

echo Zend_Filter::get('"', 'HtmlEntities', array(ENT_QUOTES));
            

静态用法对调用过滤器特别方便,但如果对多个输入运行过滤器,按上面第一个例子做更有效,创建一个过滤器对象的实例并调用它的 filter() 方法。

并且,Zend_Filter_Input 类允许初始化和运行多重过滤器,按需的校验器类来处理输入数据,参见 第 14.5 节 “Zend_Filter_Input”