2010-03-24 17 views
9

Necesito poder cambiar permanentemente las variables en un archivo php usando php.Permanentemente escribir variables en un archivo php con php

estoy creando un sitio en varios idiomas utilizando CodeIgniter y utilizando el asistente de idioma que almacena el texto en archivos php de las variables en este formato: $lang['title'] = "Stuff";

que he podido tener acceso al texto sin formato de los archivos usando fopen() etc y parece que podría localizar las áreas con las que quiero editar expresiones regulares y volver a escribir el archivo una vez que haya realizado los cambios, pero me parece un poco raro.

¿Hay alguna manera fácil de editar estas variables permanentemente usando php?

Cheers

+0

¡Buena pregunta! Está el tokenizer, pero eso solo separa el código PHP, no puede volver a unirlo. Interesado en ver qué surge. –

+1

¿Qué estás tratando de hacer exactamente? ¿Por qué necesitaría escribir dinámicamente el lenguaje en los archivos de lenguaje CodeIgniter? Si se trata de un CMS, ¿sería una mejor idea extender la biblioteca de idiomas a la interfaz con la base de datos? –

Respuesta

6

Si es sólo una matriz con la que está tratando, es posible que desee considerar var_export. Imprimirá o devolverá la expresión en un formato que sea un código PHP válido.

Así que si había language_foo.php que contenía un montón de $lang['title'] = "Stuff"; líneas, se puede hacer algo en la línea de:

include('language_foo.php'); 
$lang['title2'] = 'stuff2'; 
$data = '$lang = ' . var_export($lang, true) . ';'; 
file_put_contents('language_foo.php', '<?PHP ' . $data . ' ?>'); 

Alternativamente, si usted no querrá que editar a mano en el futuro, debería considerar almacenar los datos de una manera diferente (como en una base de datos, serialize() 'd, etc., etc.).

+0

+1 eliminó mi respuesta a favor, ¡esta es la manera más fácil! – Andy

+0

+1 para var_export incuestionablemente. No sabía que produce los datos en el formato perfecto para esto. –

+0

Si solo quieres escribir, es perfecto. –

0

Una vez me enfrenté a un problema similar. Lo arreglé simplemente agregando una plantilla inteligente. La forma en que lo hice fue de la siguiente manera:

  1. Leer la matriz del archivo
  2. se añaden al sistema
  3. pasar la matriz a Smarty
  4. bucle sobre la matriz en smarty y generar el archivo con una plantilla (de esta manera usted tiene el control total, lo que podría hacer falta en la reg-ex)
  5. Reemplazar el archivo

Déjame saber si esto ayuda.

1

Parece manera más fácil de almacenar datos en otro lugar (por ejemplo, una base de datos) y escribir un script sencillo para generar los * .php archivos, con este comentario en la parte superior:

# 
# THIS FILE IS AUTOGENERATED - DO NOT EDIT 
# 
0

Suponiendo que

  • Se necesita el archivo de diccionario en una forma legible y editable humana (sin serialización etc.)

  • La matriz diccionario es una, matriz asociativa unidimensional:

me habría

  1. include() el archivo de diccionario dentro de una función

  2. Haz todo operaciones necesarias en la matriz $lang (agregar palabras, eliminar palabras, cambiar palabras)

  3. Escribir la matriz $lang nuevo en el archivo usando un bucle simple:

    foreach ($lang as $key => $value) 
    fwrite ($file, "\$lang['$key'] = '$value';\n"; 
    

este es un enfoque muy limitado, por supuesto. Me interesaría mucho ver si existe un verdadero "analizador, cambiador y escritor de código fuente PHP". Esto debería ser posible con las funciones tokenizer.

0

Si también se trata de un sitio realmente multilingüe, puede disfrutar examinando la extensión gettext de PHP. Se trata de una biblioteca que ha estado en uso para localizar cosas durante muchos años, y donde las herramientas para mantenerse al día con los archivos de traducción han existido por casi tanto tiempo. Esto hace que el soporte de todos los idiomas en revisiones posteriores del producto sea más divertido también.

En otras noticias, no sería utilizar una matriz, pero las definiciones más adecuadas, para que tenga un archivo

switch ($lang) { 
case 'de': 
    define('HELLO','Hallo.'); 
    define('BYE','Auf wiedersehen.'); 
break; 
case 'fr': 
    define('HELLO','Bonjour'); 
    define('BYE','Au revoir.'); 
    break; 
case 'en': 
default: 
    define ('HELLO','Hello.'); 
    define ('BYE','Bye.'); 
} 

y me gustaría también generar automáticamente que a partir de una base de datos, si el mantenimiento se convierte en una molestia .

0

Pear Config le permitirá leer y escribir archivos PHP que contengan configuraciones utilizando su contenedor 'PHPArray'. He encontrado que el PHP generado es más legible que el de var_export()