# stream_filter_register

(PHP 5, PHP 7, PHP 8)

stream_filter_register — Registrar 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

- stream_wrapper_register() - Registra una envoltura de URL implementada como una clase de PHP
- stream_filter_append() - Enlaza un filtro a un flujo
- stream_filter_prepend() - Adjunta un filtro a un flujo