Zend Framework1-Zend_Filter

本文介绍了 Zend_Filter 组件的功能及使用方法,详细解释了过滤器的概念,并提供了多种标准过滤器的示例,还展示了如何创建过滤器链以及自定义过滤器。

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());
       



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值