首页
学习
活动
专区
工具
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 →

扫码关注腾讯云开发者

领取腾讯云代金券