2010-10-20 22 views
6

OK, ¿cuál es la mejor solución en php para buscar a través de un grupo de archivos contenidos de una determinada cadena y reemplazarlo por otra cosa.Buscar y reemplazar en varios archivos

Exactamente como lo hace notepad ++ pero obviamente no necesito la interfaz para eso.

Respuesta

22
foreach (glob("path/to/files/*.txt") as $filename) 
{ 
    $file = file_get_contents($filename); 
    file_put_contents($filename, preg_replace("/regexhere/","replacement",$file)); 
} 
2

Así que recientemente se topó con un problema en el que nuestro proveedor de alojamiento web convierte de PHP 5.2 punto 5.3 y en el proceso que se rompió nuestra instalación de Magento. Hice algunos ajustes individuales que se sugirieron, pero encontré que todavía había algunas áreas rotas. Me di cuenta de que la mayoría de los problemas estaban relacionados con un problema con la función "toString" presente en Magento y la función de división de PHP ahora en desuso. Al ver esto, decidí que intentaría crear algún código que encontraría y reemplazaría todas las diversas instancias de las funciones rotas. Logré tener éxito en la creación de la función, pero desafortunadamente el enfoque de disparo no funcionó. Todavía tuve errores después. Dicho esto, siento que el código tiene mucho potencial y quería publicar lo que se me ocurrió.

Por favor, use esto con precaución, sin embargo. Le recomendé comprimir una copia de sus archivos para que pueda restaurar desde una copia de seguridad si tiene algún problema.

Además, no necesariamente quiere usar esto tal cual. Proporciono el código como un ejemplo. Probablemente quiera cambiar lo que se reemplaza.

La forma en que funciona el código es que puede encontrar y reemplazar todo lo que está en la carpeta en la que se encuentra y en las subcarpetas. Lo tengo ajustado para que solo busque archivos con la extensión PHP, pero podrías cambiarlo según sea necesario. A medida que busca, enumerará los archivos que cambia. Para usar este código, guárdelo como "ChangePHPText.php" y cargue ese archivo en cualquier lugar donde necesite que se realicen los cambios. Luego puede ejecutarlo cargando la página asociada con ese nombre. Por ejemplo, mywebsite.com \ ChangePHPText.php.

<?php 
    ## Function toString to invoke and split to explode 

    function FixPHPText($dir = "./"){ 
     $d = new RecursiveDirectoryIterator($dir); 
     foreach(new RecursiveIteratorIterator($d, 1) as $path){ 
      if(is_file($path) && substr($path, -3)=='php' && substr($path, -17) != 'ChangePHPText.php'){ 
       $orig_file = file_get_contents($path); 
       $new_file = str_replace("toString(", "invoke(",$orig_file); 
       $new_file = str_replace(" split(", " preg_split(",$new_file); 
       $new_file = str_replace("(split(", "(preg_split(",$new_file); 
       if($orig_file != $new_file){ 
       file_put_contents($path, $new_file); 
       echo "$path updated<br/>"; 
       } 
      } 
     } 
    } 

    echo "----------------------- PHP Text Fix START -------------------------<br/>"; 
    $start = (float) array_sum(explode(' ',microtime())); 
    echo "<br/>*************** Updating PHP Files ***************<br/>"; 
    echo "Changing all PHP containing toString to invoke and split to explode<br/>"; 
    FixPHPText("."); 

    $end = (float) array_sum(explode(' ',microtime())); 
    echo "<br/>------------------- PHP Text Fix COMPLETED in:". sprintf("%.4f", ($end-$start))." seconds ------------------<br/>"; 
    ?> 
Cuestiones relacionadas