- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Zend Framework过滤器Zend_Filter用法详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了Zend Framework过滤器Zend_Filter用法。分享给大家供大家参考,具体如下:
引言:过滤器是对输入内容进行过滤,清除其中不符合过滤规则的内容,并将其余内容返回的过程.
Zend中有个Zend_Filter组件用来实现过滤的功能。其中有个Zend_Filter_Interface子类,该子类为实现一般过滤器提供了接口.
要实现过滤器类,需要实现该接口中一个名为filter()的方法.
下面通过实例来演示如何使用Zend_Filter中定义的过滤器,该例演示如何实现字母转小写的功能.
代码:
1
2
3
4
5
6
7
8
9
10
|
<?php
require_once
'Zend/Filter/StringToLower.php'
;
//加载子类
$filter
=
new
Zend_Filter_StringToLower;
//实例化对象
$temp1
=
"ABCDefGH"
;
//定义待过滤内容
$temp2
=
"我爱Nan Jing"
;
echo
"内容:"
.
$temp1
.
"<p>经过滤后为:"
;
echo
$filter
->filter(
$temp1
);
echo
"<p>"
;
echo
"内容:"
.
$temp2
.
"<p>经过滤后为:"
;
echo
$filter
->filter(
$temp2
);
|
结果:
内容:ABCDefGH 经过滤后为:abcdefgh 内容:我爱Nan Jing 经过滤后为:我爱nan jing 。
为什么如此神奇呢?不禁让我想探索一下其内部的构造!下面来研读一下其内部的工作原理.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
class
Zend_Filter_StringToLower
implements
Zend_Filter_Interface
{
/**
* Encoding for the input string
*
* @var string
*/
protected
$_encoding
= null;
/**
* Constructor
*
* @param string|array|Zend_Config $options OPTIONAL
*/
public
function
__construct(
$options
= null)
{
if
(
$options
instanceof
Zend_Config) {
$options
=
$options
->toArray();
}
else
if
(!
is_array
(
$options
)) {
$options
= func_get_args();
$temp
=
array
();
if
(!
empty
(
$options
)) {
$temp
[
'encoding'
] =
array_shift
(
$options
);
}
$options
=
$temp
;
}
if
(!
array_key_exists
(
'encoding'
,
$options
) && function_exists(
'mb_internal_encoding'
)) {
$options
[
'encoding'
] = mb_internal_encoding();
}
if
(
array_key_exists
(
'encoding'
,
$options
)) {
$this
->setEncoding(
$options
[
'encoding'
]);
}
}
/**
* Returns the set encoding
*
* @return string
*/
public
function
getEncoding()
{
return
$this
->_encoding;
}
/**
* Set the input encoding for the given string
*
* @param string $encoding
* @return Zend_Filter_StringToLower Provides a fluent interface
* @throws Zend_Filter_Exception
*/
public
function
setEncoding(
$encoding
= null)
{
if
(
$encoding
!== null) {
if
(!function_exists(
'mb_strtolower'
)) {
require_once
'Zend/Filter/Exception.php'
;
throw
new
Zend_Filter_Exception(
'mbstring is required for this feature'
);
}
$encoding
= (string)
$encoding
;
if
(!in_array(
strtolower
(
$encoding
),
array_map
(
'strtolower'
, mb_list_encodings()))) {
require_once
'Zend/Filter/Exception.php'
;
throw
new
Zend_Filter_Exception(
"The given encoding '$encoding' is not supported by mbstring"
);
}
}
$this
->_encoding =
$encoding
;
return
$this
;
}
/**
* Defined by Zend_Filter_Interface
*
* Returns the string $value, converting characters to lowercase as necessary
*
* @param string $value
* @return string
*/
public
function
filter(
$value
)
{
if
(
$this
->_encoding !== null) {
return
mb_strtolower((string)
$value
,
$this
->_encoding);
}
return
strtolower
((string)
$value
);
}
}
|
研读:
源代码意思大概是先实现Zend_Filter_Interface接口.
定义一个私有变量$_encoding,初始值为null,一般私有变量都是以_下划线开头.
然后通过构造函数进行初始化工作,设置encoding.
至于这个encoing属性是作何用的,我就不大清楚了,反正为了它,源码写了不少代码.
类中有三个方法,一个是setEncoding,一个是getEncoding,一个主要功能的filter。有两个方法都是为了encoding来写的.
在构造函数中使用setEncoding方法直接用$this->setEncoding()就可。就可以把私有属性设置好值了.
然后根据私有属性的内容来选择使用什么方法来使得字母变小写.
我去,这个类考虑的东西还真够多的。其实核心代码就那两句,strtolower((string) $value).
这个类很酷,我从来没用过私有属性。考虑问题也没有作者那么全面,各种验证,各种情况考虑。比如, 。
从构造函数中就可以看出他考虑问题的全面性.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
if
(
$options
instanceof
Zend_Config) {
$options
=
$options
->toArray();
}
else
if
(!
is_array
(
$options
)) {
$options
= func_get_args();
$temp
=
array
();
if
(!
empty
(
$options
)) {
$temp
[
'encoding'
] =
array_shift
(
$options
);
}
$options
=
$temp
;
}
if
(!
array_key_exists
(
'encoding'
,
$options
) && function_exists(
'mb_internal_encoding'
)) {
$options
[
'encoding'
] = mb_internal_encoding();
}
if
(
array_key_exists
(
'encoding'
,
$options
)) {
$this
->setEncoding(
$options
[
'encoding'
]);
}
|
总的来说还是值得佩服的.
下面谈谈过滤器链,它的作用是将多个过滤器串联起来配合使用。过滤器链就是多个过滤器的一个连接。在对指定的内容进行过滤时, 。
每个过滤器将按照其顺序分别进行过滤或者转化操作。当所有的过滤操作都执行完毕时,过滤器链返回最终的过滤结果.
听起来蛮有趣的啊! 。
具体实现步骤是什么呢?
首先要为类Zend_Filter实例化一个对象,然后通过该实例的addFilter()方法向过滤器链中添加过滤器.
下面通过示例演示如何使用过滤器链对数据进行多重过滤及转化.
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?php
require_once
'Zend/Filter.php'
;
//加载Zend_Filter类
require_once
'Zend/Filter/Alpha.php'
;
//加载Zend_Filter_Alpha子类
require_once
'Zend/Filter/StringToUpper.php'
;
//加载Zend_Filter_StringToUpper子类
$filterChain
=
new
Zend_Filter();
//创建过滤器链
$filterChain
->addFilter(
new
Zend_Filter_Alpha(
" "
))
->addFilter(
new
Zend_Filter_StringToUpper());
//向过滤器链中添加过滤器
$temp1
=
"12345asdf67asdfasdf"
;
$temp2
=
"#$%^!@fffff"
;
$temp3
=
"Welcome to Bei Jing"
;
echo
"内容:"
.
$temp1
.
"<p>经过过滤后为:"
;
echo
$filterChain
->filter(
$temp1
);
echo
"<p>"
;
echo
"内容:"
.
$temp2
.
"<p>经过过滤后为:"
;
echo
$filterChain
->filter(
$temp2
);
echo
"<p>"
;
echo
"内容:"
.
$temp3
.
"<p>经过过滤后为:"
;
echo
$filterChain
->filter(
$temp3
);
echo
"<p>"
;
|
结果:
内容:12345asdf67asdfasdf 经过过滤后为:ASDFASDFASDF 内容:#$%^!@fffff 经过过滤后为:FFFFF 内容:Welcome to Bei Jing 经过过滤后为:WELCOME TO BEI JING 。
分析:
这里的Alpha很强大啊,过滤数字和特殊字符,连空格都能过滤。还好我初始化的时候加了个参数" ",才使得空格保留了下来.
为何如此神奇呢?
核心代码就这一块 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public
function
filter(
$value
)
{
$whiteSpace
=
$this
->allowWhiteSpace ?
'\s'
:
''
;
if
(!self::
$_unicodeEnabled
) {
// POSIX named classes are not supported, use alternative a-zA-Z match
$pattern
=
'/[^a-zA-Z'
.
$whiteSpace
.
']/'
;
}
else
if
(self::
$_meansEnglishAlphabet
) {
//The Alphabet means english alphabet.
$pattern
=
'/[^a-zA-Z'
.
$whiteSpace
.
']/u'
;
}
else
{
//The Alphabet means each language's alphabet.
$pattern
=
'/[^\p{L}'
.
$whiteSpace
.
']/u'
;
}
return
preg_replace(
$pattern
,
''
, (string)
$value
);
}
|
分析:这里对内容进行过滤,如果不是字母或者空格,就统统去掉。用到的php方法是preg_replace。此外,还用到了正则表达式。[^a-zA-Z]表示除此之外的其他字符.
这里的$whiteSpace成员属性,是初始化的时候设置的,具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public
function
__construct(
$allowWhiteSpace
= false)
{
if
(
$allowWhiteSpace
instanceof
Zend_Config) {
$allowWhiteSpace
=
$allowWhiteSpace
->toArray();
}
else
if
(
is_array
(
$allowWhiteSpace
)) {
if
(
array_key_exists
(
'allowwhitespace'
,
$allowWhiteSpace
)) {
$allowWhiteSpace
=
$allowWhiteSpace
[
'allowwhitespace'
];
}
else
{
$allowWhiteSpace
= false;
}
}
$this
->allowWhiteSpace = (boolean)
$allowWhiteSpace
;
if
(null === self::
$_unicodeEnabled
) {
self::
$_unicodeEnabled
= (@preg_match(
'/\pL/u'
,
'a'
)) ? true : false;
}
if
(null === self::
$_meansEnglishAlphabet
) {
$this
->_locale =
new
Zend_Locale(
'auto'
);
self::
$_meansEnglishAlphabet
= in_array(
$this
->_locale->getLanguage(),
array
(
'ja'
,
'ko'
,
'zh'
)
);
}
}
|
此外,还有两个方法来设置是否允许有空格和获取是否设置了允许空格.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/**
* Returns the allowWhiteSpace option
*
* @return boolean
*/
public
function
getAllowWhiteSpace()
{
return
$this
->allowWhiteSpace;
}
/**
* Sets the allowWhiteSpace option
*
* @param boolean $allowWhiteSpace
* @return Zend_Filter_Alpha Provides a fluent interface
*/
public
function
setAllowWhiteSpace(
$allowWhiteSpace
)
{
$this
->allowWhiteSpace = (boolean)
$allowWhiteSpace
;
return
$this
;
}
|
剖析完之后,我们似乎就更了解它的构造了,就是使用正则过滤而已。同时通过属性allowWhiteSpace来控制是否过滤空格.
刚才介绍了两种过滤器,一个是StringToUpper,一个是Alpha,下面再介绍其它的一些过滤器.
首先是Alnum,过滤非数字和非字母的内容,执行filter()方法,将返回纯数字与字母的内容,它是Zend_Filter_Alpha(过滤非字母)与Zend_Filter_Digits(过滤非数值)的并集.
具体的例子就不举了,都差不多.
我们来看看它内部的构造, 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public
function
filter(
$value
)
{
$whiteSpace
=
$this
->allowWhiteSpace ?
'\s'
:
''
;
if
(!self::
$_unicodeEnabled
) {
// POSIX named classes are not supported, use alternative a-zA-Z0-9 match
$pattern
=
'/[^a-zA-Z0-9'
.
$whiteSpace
.
']/'
;
}
else
if
(self::
$_meansEnglishAlphabet
) {
//The Alphabet means english alphabet.
$pattern
=
'/[^a-zA-Z0-9'
.
$whiteSpace
.
']/u'
;
}
else
{
//The Alphabet means each language's alphabet.
$pattern
=
'/[^\p{L}\p{N}'
.
$whiteSpace
.
']/u'
;
}
return
preg_replace(
$pattern
,
''
, (string)
$value
);
}
|
通过正则过滤除字母和数字之外的内容.
下面出场的是HtmlEntities HTML过滤器.
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php
require_once
'Zend/Filter/Htmlentities.php'
;
$filter
=
new
Zend_Filter_HtmlEntities();
$temp1
=
"<img src = './1.png' width='100px'>"
;
$temp2
=
"<button>aaa</button>"
;
$temp3
=
"<h1>Welcome to Bei Jing</h1>"
;
echo
"内容:"
.
$temp1
.
"<p>经过过滤为:"
;
echo
$filter
->filter(
$temp1
);
echo
"<p>"
;
echo
"内容:"
.
$temp2
.
"<p>经过过滤为:"
;
echo
$filter
->filter(
$temp2
);
echo
"<p>"
;
echo
"内容:"
.
$temp3
.
"<p>经过过滤为:"
;
echo
$filter
->filter(
$temp3
);
echo
"<p>"
;
|
结果:
通过结果,我们看出它将html内容还原成原始代码了。由于该过滤器是对函数htmlentities进行的封装,所以遵循该函数的规则。即将“<”与“>”分别转换为“<”与“>”,经过这样的转换, 。
相应的HTML内容就变成了以其原始格式显示的字符串.
希望本文所述对大家基于Zend Framework框架的PHP程序设计有所帮助.
最后此篇关于Zend Framework过滤器Zend_Filter用法详解的文章就讲到这里了,如果你想了解更多关于Zend Framework过滤器Zend_Filter用法详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
嗨,我有一个包含此代码的 Zend 表单 $field = new Zend_Form_Element_Submit('submit'); $field->setAttrib('class', 'bt
我现在正在尝试使用 zend expressive 并研究如何处理数据库。我在看this ,但不清楚。我使用 composer 安装 zend-db,它提到在 dependencies.global.
我已经通过 Zend auth 创建了一个登录系统,这里是代码 // userAuthentication public function authAction(){ $reque
好的,所以我对 Zend 比较陌生。我已经创建了一个新的应用程序并开始构建基于 a guide 的身份验证系统.但是,服务器正在踢出一个内部服务器错误。 检查 PHP 错误日志后,我得到以下两个错误:
编辑:: 问题是由 Zend 路由引起的,请检查更新 我正在使用 xml 文件进行导航。 编辑::以下代码来自layout.phtml文件 $config = new Zend_Config_Xml(
我想将变量从 Controller 传递到表单。如何实现?谁能帮我解决这个问题。 谢谢。 最佳答案 只是一个活生生的例子: class Admin_Form_Product extends Admin
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我使用默认 Zend_Rest_Route 来生成 Rest 路由: 所以鉴于我只是把 resources.router.routes.rest.type = Zend_Rest_Route在 app
是否存在类似于 Zend Validator Identical 的 Zend Filter? 我应该过滤 input=='test' 的情况 $el->addFilter('Identical','
在/application 文件夹中创建了几个文件夹(例如表单和模型),然后开始向这些文件夹添加类之后,如何使这些类的代码自动完成在我的各种其他文件(例如我的文件)中可用IndexController
我正在尝试删除隐藏表单元素上的默认装饰器。默认情况下,隐藏元素显示如下: Hidden Element Label (if I had set one) 我不希望隐藏元素占用页面上的空间。我想删除所
我是框架新手,但我在安装 zend 1.x 版本等方面没有任何困难。但是ZF2真的搞不懂......任何资源告诉我使用 zend 工具创建项目,即 bin 目录中的 zf.bat 或 zf.sh,但与
我想使用装饰器将下面的 Zend_Form 格式化为表格,在第一列中放置描述并 Zend_Form_Element_Radio 的选项在第二列中和 在每一行中添加 2 个选择,您可以在稍后的 html
当您查看 在下面的标记中,您会看到有一个带有 id 地址标签的 dt 和以下 dd,我想删除这些但保留 字段集。 要添加显示组,我在其中使用了这个 $this->addDisplayGroup(arr
我已经阅读了所有关于路由和 Zend 文档的帖子,但我仍然无法解决这个问题。 我有一个包含两个模块的多语言应用程序:default 和 admin。语言选择工作正常(在 Controller rout
/* Form Elements & Other Definitions Here ... */ $this->setAction("auth") ->setMethod("post")
我正在按照官方教程在 Zend 服务器上部署示例 Zend 应用程序。无论我部署什么,我唯一可以访问的是 hello world 页面(Hello world 打招呼)。 如何访问真实应用程序? ho
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 3年前关闭。 Improve thi
在 Zend 中使用命名空间的最佳实践是什么? 如何管理存储库、服务等的命名空间? 我在 Zend 文档 here 中找到了一个通用的目录结构,但它没有描述在哪里放置存储库和其他服务! 请将其视为 M
我有问题,以下 Zend 表单会引发错误。 问题是"file"元素和使用 setElementDecorators。 class Products_AddForm extends Zend_F
我是一名优秀的程序员,十分优秀!