首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

stream_filter_register

(PHP 5, PHP 7)

stream_filter_register - 注册用户定义的流过滤器

描述

代码语言:javascript
复制
bool stream_filter_register ( string $filtername , string $classname )

stream_filter_register()允许你在所有其他文件系统函数(如fopen(),fread()等)使用的注册流上实现自己的过滤器。

参数

filtername

要注册的过滤器名称。

classname

要实现一个过滤器,你需要定义一个类作为php_user_filter的一个扩展,并带有许多成员函数。在对过滤器所连接的流执行读/写操作时,PHP将通过过滤器(以及附加到该流的任何其他过滤器)传递数据,以便可以根据需要修改数据。您必须完全按照php_user_filter中的描述来实现这些方法 - 否则会导致未定义的行为。

返回值

成功时返回TRUE或失败时返回FALSE

如果filtername已经定义,stream_filter_register()将返回FALSE

示例

Example#1过滤大小foo-bar.txt流上的字符

下面的示例在foo-bar.txt流上实现名为strtoupper的过滤器,该过滤器将大写写入/读取该流的所有字母字符。

代码语言:javascript
复制
<?php

/*?Define?our?filter?class?*/
class?strtoupper_filter?extends?php_user_filter?{
??function?filter($in,?$out,?&$consumed,?$closing)
??{
????while?($bucket?=?stream_bucket_make_writeable($in))?{
??????$bucket->data?=?strtoupper($bucket->data);
??????$consumed?+=?$bucket->datalen;
??????stream_bucket_append($out,?$bucket);
????}
????return?PSFS_PASS_ON;
??}
}

/*?Register?our?filter?with?PHP?*/
stream_filter_register("strtoupper",?"strtoupper_filter")
????or?die("Failed?to?register?filter");

$fp?=?fopen("foo-bar.txt",?"w");

/*?Attach?the?registered?filter?to?the?stream?just?opened?*/
stream_filter_append($fp,?"strtoupper");

fwrite($fp,?"Line1\n");
fwrite($fp,?"Word?-?2\n");
fwrite($fp,?"Easy?As?123\n");

fclose($fp);

/*?Read?the?contents?back?out
?*/
readfile("foo-bar.txt");

?>

上面的例子将输出:

代码语言:javascript
复制
LINE1
WORD - 2
EASY AS 123

示例#2注册一个通用过滤器类以匹配多个过滤器名称。

代码语言:javascript
复制
<?php

/*?Define?our?filter?class?*/
class?string_filter?extends?php_user_filter?{
??var?$mode;

??function?filter($in,?$out,?&$consumed,?$closing)
??{
????while?($bucket?=?stream_bucket_make_writeable($in))?{
??????if?($this->mode?==?1)?{
????????$bucket->data?=?strtoupper($bucket->data);
??????}?elseif?($this->mode?==?0)?{
????????$bucket->data?=?strtolower($bucket->data);
??????}

??????$consumed?+=?$bucket->datalen;
??????stream_bucket_append($out,?$bucket);
????}
????return?PSFS_PASS_ON;
??}

??function?onCreate()
??{
????if?($this->filtername?==?'str.toupper')?{
??????$this->mode?=?1;
????}?elseif?($this->filtername?==?'str.tolower')?{
??????$this->mode?=?0;
????}?else?{
??????/*?Some?other?str.*?filter?was?asked?for,
?????????report?failure?so?that?PHP?will?keep?looking?*/
??????return?false;
????}

????return?true;
??}
}

/*?Register?our?filter?with?PHP?*/
stream_filter_register("str.*",?"string_filter")
????or?die("Failed?to?register?filter");

$fp?=?fopen("foo-bar.txt",?"w");

/*?Attach?the?registered?filter?to?the?stream?just?opened
???We?could?alternately?bind?to?str.tolower?here?*/
stream_filter_append($fp,?"str.toupper");

fwrite($fp,?"Line1\n");
fwrite($fp,?"Word?-?2\n");
fwrite($fp,?"Easy?As?123\n");

fclose($fp);

/*?Read?the?contents?back?out
?*/
readfile("foo-bar.txt");
?>

上面的例子将输出:

代码语言:javascript
复制
LINE1
WORD - 2
EASY AS 123

另请参阅

  • stream_wrapper_register() - 注册一个实现为PHP类的URL包装器
  • stream_filter_append() - 将过滤器附加到流中
  • stream_filter_prepend() - 将过滤器附加到流中

← stream_filter_prepend

stream_filter_remove →

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com