(PHP 5, PHP 7, PHP 8)
stream_filter_register — Registrar un filtro de flujo definido por el usuario
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.).
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.
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