stream_filter_register

(PHP 5, PHP 7, PHP 8)

stream_filter_registerRegistra um filtro de fluxo definido pelo usuário

Descrição

stream_filter_register(string $filter_name, string $class): bool

stream_filter_register() permite implementar filtro de usuário em qualquer fluxo registrado usado com todas as outras funções de sistemas de arquivos (como fopen(), fread() etc.).

Parâmetros

filter_name

O nome do filtro a ser registrado.

class

Para implementar um filtro, deve-se definir uma classe como uma extensão de php_user_filter com um número de funções membro. Na execução de operações de leitura/escrita no fluxo ao qual o filtro estiver anexado, o PHP passará os dados através do filtro (e quaisquer outros filtros anexados ao fluxo) para que os dados possam ser modificados como desejado. Deve-se implementar os métodos exatamente como descrito em php_user_filter - caso contrário, pode-se chegar a comportamentos não definidos.

Valor Retornado

Retorna true em caso de sucesso ou false em caso de falha.

stream_filter_register() irá retornar false se o nome do filtro em filter_name já estiver definido.

Exemplos

Example #1 Filtro para converter para maiúsculas os caracteres no fluxo foo-bar.txt

O exemplo abaixo implementa um filtro chamado maiusculas no fluxo foo-bar.txt que irá converter para maiúsculas todos caracteres de letras lidos ou escritos no fluxo.

<?php

/* Define a classe de filtro */
class filtro_maiusculas extends php_user_filter {
  function filter($entrada, $saida, &$consumido, $fechando)
  {
    while ($bucket = stream_bucket_make_writeable($entrada)) {
      $bucket->data = strtoupper($bucket->data);
      $consumido += $bucket->datalen;
      stream_bucket_append($saida, $bucket);
    }
    return PSFS_PASS_ON;
  }
}

/* Registra o filtro no PHP */
stream_filter_register("maiusculas", "filtro_maiusculas")
    or die("Falha ao registrar o filtro");

$fp = fopen("foo-bar.txt", "w");

/* Anexa o filtro registrado ao fluxo que acabou de ser aberto */
stream_filter_append($fp, "maiusculas");

fwrite($fp, "Linha1\n");
fwrite($fp, "Palavra - 2\n");
fwrite($fp, "Facil Como 123\n");

fclose($fp);

/* Lê de volta o conteúdo
 */
readfile("foo-bar.txt");

?>

O exemplo acima produzirá:

LINHA1
PALAVRA - 2
FACIL COMO 123

Example #2 Registrando uma classe de filtro genérica para combinar com múltiplos nomes de filtro.

<?php

/* Define a classe de filtro */
class filtro_string extends php_user_filter {
  var $modo;

  function filter($entrada, $saida, &$consumido, $fechando)
  {
    while ($bucket = stream_bucket_make_writeable($entrada)) {
      if ($this->modo == 1) {
        $bucket->data = strtoupper($bucket->data);
      } elseif ($this->modo == 0) {
        $bucket->data = strtolower($bucket->data);
      }

      $consumido += $bucket->datalen;
      stream_bucket_append($saida, $bucket);
    }
    return PSFS_PASS_ON;
  }

  function onCreate()
  {
    if ($this->filtername == 'str.maiuscula') {
      $this->modo = 1;
    } elseif ($this->filtername == 'str.minuscula') {
      $this->modo = 0;
    } else {
      /* Algum outro filtro str.* foi solicitado,
         reportar falha para que o PHP continue procurando */
      return false;
    }

    return true;
  }
}

/* Registra o filtro no PHP */
stream_filter_register("str.*", "filtro_string")
    or die("Falha ao registrar o filtro");

$fp = fopen("foo-bar.txt", "w");

/* Anexa o filtro registrado ao fluxo que acabou de ser aberto
   Pode-se alternativamente ligar a str.minuscula aqui */
stream_filter_append($fp, "str.maiuscula");

fwrite($fp, "Linha1\n");
fwrite($fp, "Palavra - 2\n");
fwrite($fp, "Facil Como 123\n");

fclose($fp);

/* Lê de volta o conteúdo
 */
readfile("foo-bar.txt");
?>

O exemplo acima produzirá:

LINHA1
PALAVRA - 2
FACIL COMO 123

Veja Também