En PHP 5 casi cualquier operación que involucra el leer o
escribir hacia un recurso, emplea las interfazes
de flujos (streams) y de filtros.
- Existen varios filtros predefinidos (e.j. rot13)
- Soporte directo y simple para http://, https:// ftp:// ftps://
- Streams de compresión predefinidos (compression.zlib://, compress.bzip2://)
- Los flujos y filtros se pueden concatenar directamente para hacer operaciones complejas en el contenido de datos
- Se pueden definir flujos y filtros fácilmente en PHP.
Ejemplo de filtrar información
<?php
$filter = 'filter/read=string.strip_tags';
$resource = 'resource=http://pear.php.net/group';
$data = file_get_contents("php://$filter/$resource");
// removamos espacios, etc.:
$data = preg_replace('/\s+/','',$data);
// y convirtamos las entidades
$data = html_entity_decode($data);
// mostremos los primeros 20 caracteres
echo substr($data,0,20)."\n";
?>
Resultado
PEAR::ThePEARGroupRe
Definiendo un nuevo filtro
<?php
class chicha_filter extends php_user_filter {
function filter($in, $out, &$consumed, $closing) {
while ($bucket = stream_bucket_make_writeable($in)) {
// convertir entidades y remover HTML tags
$bucket->data = strip_tags($bucket->data);
$bucket->data = html_entity_decode($bucket->data);
// remover espacios y otras cosas no imprimibles
$bucket->data = preg_replace('/(\s|\xa0)+/',' ',$bucket->data);
// remover las vocales
$re = '/[aeiouAEIOU]+/';
$bucket->data = preg_replace($re,'',$bucket->data);
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}
// registrar el filtro
stream_filter_register('chicha', 'chicha_filter');
$filter = 'filter/read=chicha';
$resource = 'resource=http://www.google.com';
$data = file_get_contents("php://$filter/$resource");
// los primeros 50 caracteres
echo substr($data,0,50);
?>
Resultado
Ggl Pr� L Wb "/mghp?hl=s&tb=w&=TF-8">m�gns Grps Dr