str_replace str reemplazar preg_replace online file_put_contents especiales ejemplos ejemplo caracteres php file file-io preg-replace replace

str - Reemplazo del contenido del archivo en PHP



str replace php (2)

Necesito una función como preg_replace pero en lugar de cadenas, la necesito para trabajar con archivos / contenido de archivos.


La respuesta de @ codaddict es bastante suficiente para archivos pequeños (y sería como lo implementaría si el tamaño del archivo estuviera bajo un 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() { if (strpos($this->filtername, ''.'') === false) return false; list ($name, $arguments) = explode(''.'', $this->filtername, 2); $replace = ''''; $search = $arguments; if (strpos($arguments, ''|'') !== false) { list ($search, $replace) = explode(''|'', $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, puedes añadir 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 matrices,

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

Obviamente, este es un ejemplo muy simple (y no hace mucha comprobación 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 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 esto es que puede leer desde una secuencia HTTP, editar en línea y escribir en una secuencia de archivos. Es bastante potente (ya que puedes encadenar estos filtros) ...


Tu puedes hacer:

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