<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.stream.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'en',
  ),
  'this' => 
  array (
    0 => 'function.stream-filter-register.php',
    1 => 'stream_filter_register',
    2 => 'Register a user defined stream filter',
  ),
  'up' => 
  array (
    0 => 'ref.stream.php',
    1 => 'Stream Functions',
  ),
  'prev' => 
  array (
    0 => 'function.stream-filter-prepend.php',
    1 => 'stream_filter_prepend',
  ),
  'next' => 
  array (
    0 => 'function.stream-filter-remove.php',
    1 => 'stream_filter_remove',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'en',
    'path' => 'reference/stream/functions/stream-filter-register.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.stream-filter-register" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">stream_filter_register</h1>
  <p class="verinfo">(PHP 5, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">stream_filter_register</span> &mdash; <span class="dc-title">Register a user defined stream filter</span></p>

 </div>
 <div class="refsect1 description" id="refsect1-function.stream-filter-register-description">
  <h3 class="title">Description</h3>
  <div class="methodsynopsis dc-description">
   <span class="methodname"><strong>stream_filter_register</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$filter_name</code></span>, <span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$class</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

  <p class="para rdfs-comment">
   <span class="function"><strong>stream_filter_register()</strong></span> allows you to implement
   your own filter on any registered stream used with all the other
   filesystem functions (such as <span class="function"><a href="function.fopen.php" class="function">fopen()</a></span>,
   <span class="function"><a href="function.fread.php" class="function">fread()</a></span> etc.).
  </p>
 </div>

 
 <div class="refsect1 parameters" id="refsect1-function.stream-filter-register-parameters">
  <h3 class="title">Parameters</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">filter_name</code></dt>
     <dd>
      <p class="para">
       The filter name to be registered.
      </p>
     </dd>
    
    
     <dt><code class="parameter">class</code></dt>
     <dd>
      <p class="para">
       To implement a filter, you need to define a class as an extension of
       <span class="classname"><a href="class.php-user-filter.php" class="classname">php_user_filter</a></span> with a number of member
       functions. When performing read/write operations on the stream
       to which your filter is attached, PHP will pass the data through your
       filter (and any other filters attached to that stream) so that the
       data may be modified as desired. You must implement the methods
       exactly as described in <span class="classname"><a href="class.php-user-filter.php" class="classname">php_user_filter</a></span> - doing
       otherwise will lead to undefined behaviour.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>

 
 <div class="refsect1 returnvalues" id="refsect1-function.stream-filter-register-returnvalues">
  <h3 class="title">Return Values</h3>
  <p class="para">
   Returns <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> on success or <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> on failure.
  </p>
  <p class="para">
   <span class="function"><strong>stream_filter_register()</strong></span> will return <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> if the
   <code class="parameter">filter_name</code> is already defined.
  </p>
 </div>

 
 <div class="refsect1 examples" id="refsect1-function.stream-filter-register-examples">
  <h3 class="title">Examples</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Example #1 Filter for capitalizing characters on <var class="filename">foo-bar.txt</var> stream</strong></p>
    <div class="example-contents"><p>
     The example below implements a filter named <code class="literal">strtoupper</code>
     on the <var class="filename">foo-bar.txt</var> stream which will capitalize
     all letter characters written to/read from that stream.
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">/* Define our filter class */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">strtoupper_filter </span><span style="color: #007700">extends </span><span style="color: #0000BB">php_user_filter </span><span style="color: #007700">{<br />  function </span><span style="color: #0000BB">filter</span><span style="color: #007700">(</span><span style="color: #0000BB">$in</span><span style="color: #007700">, </span><span style="color: #0000BB">$out</span><span style="color: #007700">, &amp;</span><span style="color: #0000BB">$consumed</span><span style="color: #007700">, </span><span style="color: #0000BB">$closing</span><span style="color: #007700">)<br />  {<br />    while (</span><span style="color: #0000BB">$bucket </span><span style="color: #007700">= </span><span style="color: #0000BB">stream_bucket_make_writeable</span><span style="color: #007700">(</span><span style="color: #0000BB">$in</span><span style="color: #007700">)) {<br />      </span><span style="color: #0000BB">$bucket</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">data </span><span style="color: #007700">= </span><span style="color: #0000BB">strtoupper</span><span style="color: #007700">(</span><span style="color: #0000BB">$bucket</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">data</span><span style="color: #007700">);<br />      </span><span style="color: #0000BB">$consumed </span><span style="color: #007700">+= </span><span style="color: #0000BB">$bucket</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">datalen</span><span style="color: #007700">;<br />      </span><span style="color: #0000BB">stream_bucket_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$out</span><span style="color: #007700">, </span><span style="color: #0000BB">$bucket</span><span style="color: #007700">);<br />    }<br />    return </span><span style="color: #0000BB">PSFS_PASS_ON</span><span style="color: #007700">;<br />  }<br />}<br /><br /></span><span style="color: #FF8000">/* Register our filter with PHP */<br /></span><span style="color: #0000BB">stream_filter_register</span><span style="color: #007700">(</span><span style="color: #DD0000">"strtoupper"</span><span style="color: #007700">, </span><span style="color: #DD0000">"strtoupper_filter"</span><span style="color: #007700">)<br />    or die(</span><span style="color: #DD0000">"Failed to register filter"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">"foo-bar.txt"</span><span style="color: #007700">, </span><span style="color: #DD0000">"w"</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/* Attach the registered filter to the stream just opened */<br /></span><span style="color: #0000BB">stream_filter_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">"strtoupper"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">"Line1\n"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">"Word - 2\n"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">"Easy As 123\n"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/* Read the contents back out<br /> */<br /></span><span style="color: #0000BB">readfile</span><span style="color: #007700">(</span><span style="color: #DD0000">"foo-bar.txt"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>The above example will output:</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">LINE1
WORD - 2
EASY AS 123</pre>
</div>
    </div>
   </div>
  </p>
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Example #2 Registering a generic filter class to match multiple filter names.</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">/* Define our filter class */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">string_filter </span><span style="color: #007700">extends </span><span style="color: #0000BB">php_user_filter </span><span style="color: #007700">{<br />  var </span><span style="color: #0000BB">$mode</span><span style="color: #007700">;<br /><br />  function </span><span style="color: #0000BB">filter</span><span style="color: #007700">(</span><span style="color: #0000BB">$in</span><span style="color: #007700">, </span><span style="color: #0000BB">$out</span><span style="color: #007700">, &amp;</span><span style="color: #0000BB">$consumed</span><span style="color: #007700">, </span><span style="color: #0000BB">$closing</span><span style="color: #007700">)<br />  {<br />    while (</span><span style="color: #0000BB">$bucket </span><span style="color: #007700">= </span><span style="color: #0000BB">stream_bucket_make_writeable</span><span style="color: #007700">(</span><span style="color: #0000BB">$in</span><span style="color: #007700">)) {<br />      if (</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">mode </span><span style="color: #007700">== </span><span style="color: #0000BB">1</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$bucket</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">data </span><span style="color: #007700">= </span><span style="color: #0000BB">strtoupper</span><span style="color: #007700">(</span><span style="color: #0000BB">$bucket</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">data</span><span style="color: #007700">);<br />      } elseif (</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">mode </span><span style="color: #007700">== </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$bucket</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">data </span><span style="color: #007700">= </span><span style="color: #0000BB">strtolower</span><span style="color: #007700">(</span><span style="color: #0000BB">$bucket</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">data</span><span style="color: #007700">);<br />      }<br /><br />      </span><span style="color: #0000BB">$consumed </span><span style="color: #007700">+= </span><span style="color: #0000BB">$bucket</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">datalen</span><span style="color: #007700">;<br />      </span><span style="color: #0000BB">stream_bucket_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$out</span><span style="color: #007700">, </span><span style="color: #0000BB">$bucket</span><span style="color: #007700">);<br />    }<br />    return </span><span style="color: #0000BB">PSFS_PASS_ON</span><span style="color: #007700">;<br />  }<br /><br />  function </span><span style="color: #0000BB">onCreate</span><span style="color: #007700">()<br />  {<br />    if (</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">filtername </span><span style="color: #007700">== </span><span style="color: #DD0000">'str.toupper'</span><span style="color: #007700">) {<br />      </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">mode </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />    } elseif (</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">filtername </span><span style="color: #007700">== </span><span style="color: #DD0000">'str.tolower'</span><span style="color: #007700">) {<br />      </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">mode </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />    } else {<br />      </span><span style="color: #FF8000">/* Some other str.* filter was asked for,<br />         report failure so that PHP will keep looking */<br />      </span><span style="color: #007700">return </span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />    }<br /><br />    return </span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />  }<br />}<br /><br /></span><span style="color: #FF8000">/* Register our filter with PHP */<br /></span><span style="color: #0000BB">stream_filter_register</span><span style="color: #007700">(</span><span style="color: #DD0000">"str.*"</span><span style="color: #007700">, </span><span style="color: #DD0000">"string_filter"</span><span style="color: #007700">)<br />    or die(</span><span style="color: #DD0000">"Failed to register filter"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">"foo-bar.txt"</span><span style="color: #007700">, </span><span style="color: #DD0000">"w"</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/* Attach the registered filter to the stream just opened<br />   We could alternately bind to str.tolower here */<br /></span><span style="color: #0000BB">stream_filter_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">"str.toupper"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">"Line1\n"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">"Word - 2\n"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">"Easy As 123\n"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/* Read the contents back out<br /> */<br /></span><span style="color: #0000BB">readfile</span><span style="color: #007700">(</span><span style="color: #DD0000">"foo-bar.txt"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>The above example will output:</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">LINE1
WORD - 2
EASY AS 123</pre>
</div>
    </div>
   </div>
  </p>
 </div>

 
 <div class="refsect1 seealso" id="refsect1-function.stream-filter-register-seealso">
  <h3 class="title">See Also</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="function"><a href="function.stream-wrapper-register.php" class="function" rel="rdfs-seeAlso">stream_wrapper_register()</a> - Register a URL wrapper implemented as a PHP class</span></li>
    <li><span class="function"><a href="function.stream-filter-append.php" class="function" rel="rdfs-seeAlso">stream_filter_append()</a> - Attach a filter to a stream</span></li>
    <li><span class="function"><a href="function.stream-filter-prepend.php" class="function" rel="rdfs-seeAlso">stream_filter_prepend()</a> - Attach a filter to a stream</span></li>
   </ul>
  </p>
 </div>

</div><?php manual_footer($setup); ?>