Saltar al contenido

Reemplazar el contenido del archivo en PHP

Si encuentras algo que te causa duda puedes dejarlo en los comentarios y te responderemos rápidamente.

Solución:

Tu puedes hacer:

$file = 'filename';
file_put_contents($file,str_replace('find','replace',file_get_contents($file)));

La respuesta de @codaddict es bastante suficiente para archivos pequeños (y sería cómo lo implementaría si el tamaño del archivo fuera inferior a MiB). Sin embargo, consumirá una tonelada de memoria y, como tal, debe tener cuidado al leer archivos grandes.

Si desea una versión mucho más amigable con la memoria, puede usar filtros de flujo…

class ReplaceText_filter extends php_user_filter 
    protected $search = '';
    protected $replace = '';

    public function filter($in, $out, &$consumed, $closing) 
        while ($bucket = stream_bucket_make_writable($in)) 
            $bucket->data = str_replace(
                $this->search, 
                $this->replace, 
                $bucket->data
            );
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        
        return PSFS_PASS_ON;
    

    public function onCreate() ') !== false) ', $arguments, 2);
        
        if (strpos($search, ',') !== false) 
            $search = explode(',', $search);
        
        if (strpos($replace, ',') !== false) 
            $search = explode(',', $replace);
        
        $this->search = $search;
        $this->replace = $replace;
    

stream_filter_register('replacetext.*', 'ReplaceText_Filter');

Entonces, puede agregar un filtro de flujo arbitrario. El nombre del filtro determina los argumentos:

$search = 'foo';
$replace = 'bar';
$name = 'replacetext.'.$search.'|'.$replace;
stream_filter_append($stream, $name);

o para arreglos,

$search = array('foo', 'bar');
$replace = array('bar', 'baz');
$name = 'replacetext.'.implode(',', $search).'|'.implode(',', $replace);
stream_filter_append($stream, $name);

Obviamente, este es un ejemplo realmente simple (y no realiza muchas comprobaciones de errores), pero te permite hacer algo como esto:

$f1 = fopen('mysourcefile', 'r');
$f2 = fopen('mytmpfile', 'w');
$search = array('foo', 'bar');
$replace = array('bar', 'baz');
$name = 'replacetext.'.implode(',', $search).'|'.implode(',', $replace);
stream_filter_append($f1, $name);
stream_copy_to_stream($f1, $f2);
fclose($f1);
fclose($f2);
rename('mytmpfile', 'mysourcefile');

Y eso mantendrá el uso de la memoria muy bajo mientras se procesan archivos potencialmente grandes (GiB o TiB)…

Ah, y la otra cosa interesante es que puede editar en línea diferentes tipos de flujo. Lo que quiero decir con eso es que puede leer desde un flujo HTTP, editar en línea y escribir en un flujo de archivos. Es bastante poderoso (ya que puedes encadenar estos filtros)…

Valoraciones y comentarios

Recuerda dar visibilidad a esta división si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *