(PHP 5, PHP 7)
stream_filter_register — Registrar un filtro de flujo definido por el usuario
$filtername
   , string $classname
   ) : boolstream_filter_register() permite implementar un filtro propio sobre cualquier flujo registrado usado con las demás funciones de sistema de archivos (como fopen(), fread() etc.).
filternameEl nombre del filtro que va a ser registrado.
classnamePara implementar un filtro se necesita definir una clase como una extensión de php_user_filter con un número de funciones miembro. Cuando se lleva a cabo operaciones de lectura/escritura en el flujo al cuál el filtro está enlazado, PHP pasará la información a través de este filtro (y cualquier otro filtro enlazado a ese flujo) por lo que la información puede ser modificada como se desee. Se deben implementar los métodos exactamente como se describe en php_user_filter - hacerlo de otro modo conducirá a un comportamiento indefinido.
   Devuelve TRUE en caso de éxito o FALSE en caso de error.
  
   stream_filter_register() devolverá FALSE si
   filtername ya está definido.
  
Ejemplo #1 Filtro para poner en mayúsculas caracteres en el flujo foo-bar.txt
El ejemplo de abajo implementa un filtro llamado strtoupper en el flujo foo-bar.txt que pondrá en mayúsculas todos los caracteres de letras escritos en/leídos desde este flujo.
<?php
/* Definir nuestra clase de filtro */
class strtoupper_filter extends php_user_filter {
  function filter($entrada, $salida, &$consumido, $cerrar)
  {
    while ($recipiente = stream_bucket_make_writeable($entrada)) {
      $recipiente->data = strtoupper($recipiente->data);
      $consumido += $recipiente->datalen;
      stream_bucket_append($salida, $recipiente);
    }
    return PSFS_PASS_ON;
  }
}
/* Registrar nuestro filtro con PHP */
stream_filter_register("strtoupper", "strtoupper_filter")
    or die("Fallo al registrar el filtro");
$fp = fopen("foo-bar.txt", "w");
/* Enlazar el filtro al flujo recién abierto */
stream_filter_append($fp, "strtoupper");
fwrite($fp, "Fila1\n");
fwrite($fp, "Palabra - 2\n");
fwrite($fp, "Tan Sencillo Como 123\n");
fclose($fp);
/* Leer el contenido desde atrás
 */
readfile("foo-bar.txt");
?>
El resultado del ejemplo sería:
FILA1 PALABRA - 2 TAN SENCILLO COMO 123
Ejemplo #2 Registrar una clase de filtro genérica para comparar múltiples nombres de filtro.
<?php
/* Definir nuestra clase de filtro */
class string_filter extends php_user_filter {
  var $modo;
  function filter($entrada, $salida, &$consumido, $cerrar)
  {
    while ($recipiente = stream_bucket_make_writeable($entrada)) {
      if ($this->mode == 1) {
        $recipiente->data = strtoupper($recipiente->data);
      } elseif ($this->mode == 0) {
        $recipiente->data = strtolower($recipiente->data);
      }
      $consumido += $recipiente->datalen;
      stream_bucket_append($salida, $recipiente);
    }
    return PSFS_PASS_ON;
  }
  function onCreate()
  {
    if ($this->filtername == 'str.toupper') {
      $this->mode = 1;
    } elseif ($this->filtername == 'str.tolower') {
      $this->mode = 0;
    } else {
      /* Se preguntó por otro filtro str.*,
         informar del fallo, por lo que PHP seguirá mirando */
      return false;
    }
    return true;
  }
}
/* Registrar nuestro filtro con PHP */
stream_filter_register("str.*", "string_filter")
    or die("Fallo al registrar el filtro");
$fp = fopen("foo-bar.txt", "w");
/* Enlazar el filtro al flujo recién abierto
   Alternativamente podríamos enlazar a str.tolower aquí */
stream_filter_append($fp, "str.toupper");
fwrite($fp, "Fila1\n");
fwrite($fp, "Palabra - 2\n");
fwrite($fp, "Tan Sencillo Como 123\n");
fclose($fp);
/* Leer el contenido desde atrás
 */
readfile("foo-bar.txt");
?>
El resultado del ejemplo sería:
FILA1 PALABRA - 2 TAN SENCILLO COMO 123