coge la información y corre

Iré a la Valencia Pillow Fight

28 de Mayo del 2009 Escrito por Alex Barros

Yo voy… nos veremos allí?
13 de Junio en la pza. de la Virgen. Si estás de exámenes, no veo mejor manera de desahogarse! :D

Categorias: Boozox | 3 comentarios »

Script PHP para explorar archivos y directorios recursivamente

2 de Mayo del 2009 Escrito por Alex Barros

No es la primera vez que necesito construirme un script como éste, así que voy a publicarlo tanto para mí en el futuro como para todo aquél que pueda servirle.

Este script de PHP sencillamente recorre todos los archivos y directorios (y archivos dentro de directorios) a partir de cierta dirección que le proporciones, para realizar la tarea que tu quieras.

En mi caso, necesitaba encontrar todos los archivos PHP, y buscar en su interior el primer parámetro de todas las apariciones de la función t()

Para ello hice un ereg (expresión regular) al nombre de cada archivo, y a los que fueran php, hice otra expresión regular más compleja, que extrajera el primer parámetro de todas las funciones t() ejecutadas en el archivo, y lo almacenase en un array.

  1. <?php
  2. $contenido = array();
  3. function inspecRec($dir) {
  4.         global $contenido;
  5.         if ($gd = opendir($dir)) { //Abro directorio
  6.                 while (($ar = readdir($gd)) !== false) { //recorro su interior
  7.                         if(eregi(".*\.php",$ar)) { //compruebo extension
  8.                                 $co = file_get_contents($dir.‘/’.$ar); //extraigo su contenido
  9.                                 preg_match_all("/[^a-zA-Z]t\(‘(.*)’(,.+)?\)/Ui",$co,$re); //compruebo funcion t()
  10.                                
  11.                                 if(count($re[1])) { //si ha encontrado contenido…
  12.                                         echo "<br><strong>$dir/$ar</strong>"; flush(); //imprimo el nombre de archivo
  13.                                         foreach($re[1] as $r){ //introduzco frases
  14.                                                 if(!isset($contenido[$r]))
  15.                                                         $contenido[$r] = $r;
  16.                                         }
  17.                                 } else {
  18.                                         echo "<br>$dir/$ar"; flush(); //imprimo nombre de archivo
  19.                                 }
  20.                         } elseif(is_dir($ar) && $ar != ‘.’  && $ar != ‘..’) { //si es un directorio..
  21.                                 inspecRec($ar); //recursivamente lo inspecciono tambien
  22.                         }
  23.                 }
  24.                 closedir($gd); //cierro el recurso
  25.         } else {
  26.                 echo "<hr>Error: $dir<br>";
  27.         }
  28. }
  29.  
  30. inspecRec(‘./’); //Ejecuto desde el directorio actual
  31. ?>

[Descargar código]

El uso que le he dado esta vez, más concretamente, era recorrer todos los archivos del programa Gpsia, para buscar la función t() que es la encargada de traducir. Quiero pasar del sistema actual hecho por mí, al sistema estándar de traducción que es gettext(), soportado por PHP (como Wordpress). (Hablaré de esto próximamente)

Estas traducciones se hacen a partir de archivos .po, y mi script genera automáticamente un archivo .po preparado para ser traducido a cualquier idioma. El código específico es éste:

  1. msgid ""
  2. msgstr ""
  3. "Project-Id-Version: Gpsia 3.0\n"
  4. "POT-Creation-Date: \n"
  5. "PO-Revision-Date: \n"
  6. "Last-Translator: Alex Barros <zumbenet@gmail.com>\n"
  7. "Language-Team: \n"
  8. "MIME-Version: 1.0\n"
  9. "Content-Type: text/plain; charset=utf-8\n"
  10. "Content-Transfer-Encoding: 8bit\n"
  11. "X-Poedit-Language: Spanish\n"
  12. "X-Poedit-Country: SPAIN\n"
  13. "X-Poedit-SourceCharset: utf-8\n"
  14. <?php
  15. $frases = array();
  16.  
  17. function inspecRec($dir) {
  18.         global $frases;
  19.         if ($gd = opendir($dir)) {
  20.                 while (($ar = readdir($gd)) !== false) {
  21.                         if(eregi(".*\.php",$ar)) {
  22.                                 $co = file_get_contents($dir.‘/’.$ar);
  23.                                 preg_match_all("/[^a-zA-Z]t\(‘(.*)’(,.+)?\)/Ui",$co,$re);
  24.                                
  25.                                 if(count($re[1])) {
  26.                                         #echo "<br><strong>$dir/$ar</strong>"; flush();
  27.                                         foreach($re[1] as $r){
  28.                                                 if(!isset($frases[$r]))
  29.                                                         $frases[$r] = $r;
  30.                                         }
  31.                                 } else {
  32.                                         #echo "<br>$dir/$ar"; flush();
  33.                                 }
  34.                         } elseif(is_dir($ar) && $ar != ‘.’  && $ar != ‘..’) {
  35.                                 inspecRec($ar);
  36.                         }
  37.                 }
  38.                 closedir($gd);
  39.         } else {
  40.                 #echo "<hr>Error: $dir<br>";
  41.         }
  42. }
  43. inspecRec(‘./’);
  44. sort($frases);
  45. foreach($frases as $f) {
  46.         echo "msgid \"".str_replace(array(‘"’,"\n"),array(\”,""),stripslashes($f))."\"\nmsgstr \"\"\n\n";
  47. }
  48. ?>

[Descargar código]

Categorias: Boozox | 2 comentarios »

del.icio.us meneame.net RSS

Buscar:

Gpsia Descubre y comparte rutas por todo el mundo, tomadas con GPS. Ver más Imaset Edita tus imágenes de Wordpress con este sencillo plugin. Ver más

¡Mi música es tuya!

Digo yo que...

Mis fotos de Flickr

Entradas Recientes

Meta:

Respeta el copyleft

,