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știDeprecatedpentru tipul de retur lipsă.
Comenzi înrudite
stream_bucket_make_writeable: Ia următoarea bucată de date din intrarea unui filtru propriu; împreună cu stream_bucket_append/prepend/new.stream_filter_append / stream_filter_prepend: Atașează un filtru unui stream, ca datele să fie transformate (majuscule, base64, comprimare) la citire sau scriere.stream_get_filters: Returnează lista filtrelor de stream disponibile (string.toupper, convert.*, zlib.* și cele proprii).