stream_filter_register

(PHP 5, PHP 7)

stream_filter_registerRegistrar un filtro de flujo definido por el usuario

Descripción

stream_filter_register ( string $filtername , string $classname ) : bool

stream_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.).

Parámetros

filtername

El nombre del filtro que va a ser registrado.

classname

Para 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.

Valores devueltos

Devuelve TRUE en caso de éxito o FALSE en caso de error.

stream_filter_register() devolverá FALSE si filtername ya está definido.

Ejemplos

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

Ver también