PHP 8.4.1 Released!

stream_filter_register

(PHP 5, PHP 7, PHP 8)

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

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top