Confidare Weblog

PHP

PHP: Locales + PCRE = ¡Kabum!

por jcataldo el Feb.17, 2009, bajo Informática, Ingeniería de Software, PHP

En principio, es buena la idea de los patrones \w y \W en las expresiones regulares PCRE de PHP. Según la documentación, el patrón \w debe calzar con cualquier carácter de “palabra” (esto es, letras, dígitos y la barra inferior “_”), considerando el locale actual. Cito:

Un caracter de “palabra” es cualquier letra o dígito, o el caracter de subrayado, esto quiere decir, cualquier caracter que pueda ser parte de una “palabra” en Perl. La definición de letras y dígitos es controlada por las tablas de caracteres de PCRE, y puede variar si se están efectuando coincidencias específicas a localidades. Por ejemplo, en la localidad “fr” (Francia), algunos códigos de caracteres mayores a 128 son usados para letras con acentos, y éstas coinciden con \w.

Esta última característica haría que, por ejemplo, la función preg_replace fuera idónea para sanitizar datos ingresados por el usuario; por ejemplo, podríamos reemplazar fácilmente cualquier carácter “extraño” por un espacio mediante un simple:

preg_replace(’/\W/’, ‘ ‘, $q)

La gracia sería que no reemplazara los caracteres acentuados, ni a nuestra querida letra “Ñ”. Según la documentación, todo lo que habría que hacer para lograrlo es asegurarse de que el locale esté ajustado al valor correcto. Sin embargo, miren este caso de prueba:

< ?php
echo setlocale(LC_ALL, ‘es_CL.UTF-8′) . “\n”;
echo preg_replace(’/\W/u’, ‘ ‘, ‘año’) . “\n”;

La salida es:

$ php -f test.php
es_CL.UTF-8
a o

De manera que la “ñ” no es considerada un carácter de “palabra”. ¡Bien, PHP! En devnetwork.net un tipo llegó a probar todo el juego ASCII para finalmente concluir de que el locale es ignorado por las funciones PCRE de PHP.

Ah, por supuesto. ¿Tiene que haber otra manera de lograrlo, no? Claro que no es tan elegante:

preg_replace(’/[^A-Za-z0-9áéíóúÁÉÍÓÚñÑ_]/’, ‘ ‘, $q);

En tardes como ésta puedo llegar a entender a los php-haters.

Actualización: Gracias a Roberto dimos con una mejor alternativa para evitar este “bug”. Mira en los comentarios para más detalles.

2 comentarios más...

Mañoso, mañoso manejo de “culture” en Symfony

por jcataldo el Feb.16, 2009, bajo Informática, Ingeniería de Software, PHP, Symfony

Nada más quería advertir a quienes pasen por aquí que acabo de perder media hora tratando de descubrir por qué el lenguaje del calendario dynarch de la aplicación Symfony en que estoy trabajando volvió a cambiarse de español a inglés, con los consiguientes errores a la hora de almacenar las fechas en la base de datos (por el formato).

Resulta que, por alguna razón (ahí está el misterio), —y a pesar de que mi default_culture está en “es” en el archivo settings.yml— a la hora de incluir los archivos JS del calendario Symfony se encontraba con que la “cultura” del usuario era “en” en lugar de “es”. Después de varios cabezazos y por pura prueba y error, descubrí que el problema residía en la sesión. En la sesión simplemente la cultura había quedado como “en”.

Así que, bastó con borrar las cookies involucradas (gracias a San Web Developer Toolbar) para resolver el problema.

¿Cómo llegó a meterse esa cookie venenosa ahí? Ahora que lo pienso, a la otra aplicación en la que estoy trabajando no le he configurado aún el default_culture, de manera que de ahí debe venir la contaminación. Increíblemente, la reflexión que tuve que hacer para escribir este post me ayudó a encontrar la raíz del problema. ¡Gracias por su ayuda!

1 comentario más...

Presentaciones

por jcataldo el Dec.06, 2006, bajo Confidare, Ingeniería de Software, PHP, Symfony

Durante este año hice dos presentaciones para el Ciclo de Charlas Técnicas del DI, una dedicada a Subversion y la otra a Symfony; en el contexto del Ciclo, me pidieron que repitiera la primera. La segunda despertó tanto interés que me invitaron a la Feria de Software, en Santiago, para repetirla.

Los PDF con las diapositivas están publicadas en la web del Ciclo de Charlas Técnicas, pero creo necesario tenerlas también aquí en el Weblog, así que a a continuación los enlaces para las descargas y el texto promocional de las presentaciones:

Subversion, la Piedra Angular del SCM

Descargar las diapositivas en PDF

Subversion es un sistema de control de versiones centralizado y multiplataforma, orientado a reemplazar al vetusto CVS en proyectos de código abierto.

A pesar de lo limitado de sus objetivos, la herramienta tiene el potencial para convertirse en la piedra angular del SCM (Software Configuration Management) en proyectos de todo ámbito y tamaño.

A lo largo de la presentación se muestra problemas típicos y recurrentes relacionados con el SCM, y cómo Subversion puede ayudar a resolverlos. Algunos de los escenarios analizados son:

  • Desarrollo cooperativo.
  • Separación del desarrollo en ramas.
  • Control de entregas.
  • Inclusión de bibliotecas de terceros.
  • Control general del proyecto.

Symfony, el Nirvana del Programador Web

Descargar las diapositivas en PDF

Symfony es un framework orientado a acelerar la creación y mantenimiento de aplicaciones web, que elimina la necesidad de repetir tareas tediosas de un proyecto a otro. Su único requisito es PHP 5, y es compatible prácticamente con cualquier motor de bases de datos disponible en el mercado. La herramienta puede reducir considerablemente los costos asociados a un proyecto de desarrollo de software, pues proporciona apoyo especial a las siguientes tareas:

  • Separar las capas lógicas de la aplicación.
  • Generar el mapeo relacional-objeto, necesario para acceder a los datos desde la aplicación.
  • Administrar en forma declarativa y sencilla la configuración del proyecto.
  • Crear y aplicar tests sistemáticamente al software.
  • Documentar la API del software.
  • Poner en producción la aplicación (deployment).
  • Usar caching para acelerar la ejecución.
  • Poblar una base de datos con registros de prueba.
  • Manejar autenticación y autorización.
  • …y un largo etcétera.

La presentación consta de una introducción a los conceptos en los cuales Symfony está basado.

Escribe un comentario más...