stream_filter_register în PHP

Stream-uri PHP 5.0+

Înregistrează un filtru de stream propriu, scris ca o clasă care extinde php_user_filter.

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

Ce face stream_filter_register

Un filtru propriu este o clasă care extinde php_user_filter și are metoda filter. PHP îi dă datele în bucăți (bucket-uri): le iei din $in cu stream_bucket_make_writeable, le modifici și le pui în $out cu stream_bucket_append.

După înregistrare, filtrul se folosește ca oricare altul: cu stream_filter_append sau în adrese php://filter/read=nume/resource=.... Metoda returnează PSFS_PASS_ON când a trimis date mai departe.

Parametri

Parametru Descriere
$filter_name Numele filtrului, de exemplu "cenzura". Poate conține .* pentru o familie.
$class Numele clasei care extinde php_user_filter.

Ce returnează

true la succes, false dacă numele este deja folosit.

Exemple

Exemplul 1: Un filtru care ascunde cuvinte

<?php
class Cenzura extends php_user_filter
{
    public function filter($in, $out, &$consumed, bool $closing): int
    {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = str_replace("prost", "*****", $bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

var_dump(stream_filter_register("cenzura", "Cenzura"));

file_put_contents("comentarii.txt", "Ce film prost!\nActorii au jucat prost.\n");
$f = fopen("comentarii.txt", "r");
stream_filter_append($f, "cenzura");
echo fread($f, 100);

Rezultat

bool(true)
Ce film *****!
Actorii au jucat *****.

Exemplul 2: Folosit prin php://filter

<?php
class Majuscule extends php_user_filter
{
    public function filter($in, $out, &$consumed, bool $closing): int
    {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = strtoupper($bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

stream_filter_register("majuscule", "Majuscule");
file_put_contents("salut.txt", "salut din cluj");

echo file_get_contents("php://filter/read=majuscule/resource=salut.txt");

Rezultat

SALUT DIN CLUJ

Greșeli frecvente

  • Cauți un cuvânt care poate fi împărțit între două bucket-uri. Pentru fișiere mari, PHP trimite datele în bucăți de aproximativ 8 KB, iar „pro” poate ajunge într-una și „st” în următoarea. Pentru înlocuiri sigure, păstrează ultimele caractere între apeluri.
  • Scrii metoda fără tipurile din clasa părinte (bool $closing, : int). În PHP 8 primești Deprecated pentru tipul de retur lipsă.

Comenzi înrudite