Tabla de contenidos
- 35.1. Introducción
- 35.2. Clases de filtro estándar
- 35.2.1. Alnum
- 35.2.2. Alpha
- 35.2.3. BaseName
- 35.2.4. Boolean
- 35.2.5. Callback
- 35.2.6. Compress y Decompress
- 35.2.6.1. Opciones soportadas para Zend_Filter_Compress y Zend_Filter_Decompress
- 35.2.6.2. Adaptadores de compresión soportados
- 35.2.6.3. Manejo genérico
- 35.2.6.4. Crear un archivo comprimido
- 35.2.6.5. Descomprimir un archivo comprimido
- 35.2.6.6. Adaptador Bz2
- 35.2.6.7. Adaptador Gz
- 35.2.6.8. Adaptador Lzf
- 35.2.6.9. Adaptador Rar
- 35.2.6.10. Adaptador Tar
- 35.2.6.11. Adaptador Zip
- 35.2.7. Digits
- 35.2.8. Dir
- 35.2.9. Encrypt y Decrypt
- 35.2.10. HtmlEntities
- 35.2.11. Int
- 35.2.12. LocalizedToNormalized y NormalizedToLocalized
- 35.2.13. Null
- 35.2.14. PregReplace
- 35.2.15. RealPath
- 35.2.16. StringToLower
- 35.2.17. StringToUpper
- 35.2.18. StringTrim
- 35.2.19. StripNewLines
- 35.2.20. StripTags
- 35.3. Cadenas de filtros
- 35.4. Escribiendo filtros
- 35.5. Zend_Filter_Input
- 35.6. Zend_Filter_Inflector
El componente Zend_Filter proporciona un conjunto de filtros de datos
comúnmente necesarios. También proporciona un mecanismo simple de encadenamiento de filtros
mediante el cual se pueden aplicar múltiples filtros a un único dato
en un orden definido por el usuario.
En el mundo físico, un filtro se utiliza típicamente para eliminar porciones no deseadas de una entrada, y la porción deseada de la entrada pasa a través como salida del filtro (por ejemplo, café). En tales escenarios, un filtro es un operador que produce un subconjunto de la entrada. Este tipo de filtrado es útil para aplicaciones web - eliminar entradas no permitidas, recortar espacios en blanco innecesarios, etc.
Esta definición básica de un filtro puede extenderse para incluir
transformaciones generalizadas sobre la entrada. Una transformación común
aplicada en las aplicaciones web es el escapado de entidades HTML. Por
ejemplo, si un campo de formulario se rellena automáticamente con una entrada no confiable
(por ejemplo, desde un navegador web), este valor debería estar libre
de entidades HTML o contener solo entidades HTML
escapadas, con el fin de prevenir un comportamiento no deseado y vulnerabilidades de seguridad. Para cumplir
este requisito, las entidades HTML que aparezcan en la entrada deben
ser eliminadas o escapadas. Por supuesto, qué enfoque es más
apropiado depende de la situación. Un filtro que elimina las
entidades HTML opera dentro del alcance de la primera definición de
filtro - un operador que produce un subconjunto de la entrada. Un filtro
que escapa las entidades HTML, sin embargo, transforma la entrada
(por ejemplo, "&" se transforma en
"&"). Soportar estos casos de uso para los
desarrolladores web es importante, y "filtrar," en el contexto del uso de
Zend_Filter, significa realizar algunas transformaciones sobre los datos
de entrada.
Habiendo establecido esta definición de filtro, se proporciona la base
para Zend_Filter_Interface, que requiere que un
único método llamado filter() sea implementado por una clase
de filtro.
A continuación se muestra un ejemplo básico del uso de un filtro sobre dos datos de entrada, los caracteres de ampersand (&) y comilla doble ("):
$htmlEntities = new Zend_Filter_HtmlEntities();
echo $htmlEntities->filter('&'); // &
echo $htmlEntities->filter('"'); // "
Si resulta inconveniente cargar una determinada clase de filtro y crear una
instancia del filtro, puede utilizar el método estático
Zend_Filter::filterStatic() como estilo alternativo de invocación.
El primer argumento de este método es un valor de dato de entrada, que
pasaría al método filter(). El segundo
argumento es una cadena, que corresponde al nombre base de la
clase de filtro, relativo al espacio de nombres Zend_Filter. El
método staticFilter() carga automáticamente la clase, crea
una instancia, y aplica el método filter() a los datos
de entrada.
echo Zend_Filter::filterStatic('&', 'HtmlEntities');
También puede pasar un array de argumentos del constructor, si son necesarios para la clase de filtro.
echo Zend_Filter::filterStatic('"',
'HtmlEntities',
array('quotestyle' => ENT_QUOTES));
El uso estático puede ser conveniente para invocar un filtro de forma ad hoc,
pero si necesita ejecutar un filtro para múltiples entradas,
es más eficiente seguir el primer ejemplo anterior,
creando una instancia del objeto filtro y llamando a su
método filter().
Además, la clase Zend_Filter_Input le permite instanciar y
ejecutar múltiples clases de filtros y validadores bajo demanda para procesar
conjuntos de datos de entrada. Vea Zend_Filter_Input.
Cuando trabaje con filtros propios definidos, puede pasar un cuarto parámetro
a Zend_Filter::filterStatic() que es el espacio de nombres
donde se puede encontrar su filtro.
echo Zend_Filter::filterStatic(
'"',
'MyFilter',
array($parameters),
array('FirstNamespace', 'SecondNamespace')
);
Zend_Filter también permite establecer espacios de nombres por defecto.
Esto significa que puede establecerlos una vez en su bootstrap y no tener que darlos
de nuevo en cada llamada a Zend_Filter::filterStatic().
El siguiente fragmento de código es idéntico al anterior.
Zend_Filter::setDefaultNamespaces(array('FirstNamespace', 'SecondNamespace'));
echo Zend_Filter::filterStatic('"', 'MyFilter', array($parameters));
echo Zend_Filter::filterStatic('"', 'OtherFilter', array($parameters));
Para su comodidad existen los siguientes métodos que permiten el manejo de espacios de nombres:
Zend_Filter::getDefaultNamespaces(): Devuelve todos los espacios de nombres por defecto establecidos como un array.Zend_Filter::setDefaultNamespaces(): Establece nuevos espacios de nombres por defecto y sobrescribe cualquier valor establecido previamente. Acepta una cadena para un único espacio de nombres o un array para múltiples espacios de nombres.Zend_Filter::addDefaultNamespaces(): Añade espacios de nombres adicionales a los ya establecidos. Acepta una cadena para un único espacio de nombres o un array para múltiples espacios de nombres.Zend_Filter::hasDefaultNamespaces(): DevuelveTRUEcuando hay uno o más espacios de nombres por defecto establecidos, yFALSEcuando no hay ninguno establecido.
Cuando se utilizan dos filtros uno tras otro, hay que tener en cuenta que a menudo no es posible obtener la salida original utilizando el filtro opuesto. Tome el siguiente ejemplo:
$original = "my_original_content"; // Adjuntar un filtro $filter = new Zend_Filter_Word_UnderscoreToCamelCase(); $filtered = $filter->filter($original); // Usar su opuesto $filter2 = new Zend_Filter_Word_CamelCaseToUnderscore(); $filtered = $filter2->filter($filtered)
El ejemplo de código anterior podría dar la impresión de que se obtendrá la salida original después de aplicar el segundo filtro. Pero pensando lógicamente esto no es el caso. Después de aplicar el primer filtro my_original_content se cambiará a MyOriginalContent. Pero después de aplicar el segundo filtro el resultado es My_Original_Content.
Como puede ver, no siempre es posible obtener la salida original utilizando un filtro que parece ser el opuesto. Depende del filtro y también de la entrada dada.