多个文件中的字符串替换

时间:2018-11-21 15:05:36

标签: php arrays wordpress file-get-contents str-replace

我有此功能,可以搜索和替换php文件中的给定术语。 当我传递带有多个文件的数组时,文件不会被修改,为避免此问题,我一次只能传递两个文件。如何修复或改进此功能?我认为问题是因为多个文件会占用过多的内存,但是我不确定。任何帮助表示赞赏。 (我正在使用wordpress安装测试该功能,以查找并替换某些文件夹和文件的wp前缀。)

function wp_settings_edit(array $filename, array $patterns, array $replace){
  foreach($filename as $file){
    $wp_file = file_get_contents(__DIR__."/{$file}");
    foreach($patterns as $pattern){
      foreach($replace as $r){
      $wp_file_content = file_put_contents(__DIR__."/{$file}",str_replace("{$pattern}", "{$r}", $wp_file));
      }
    }
  }
}

用法示例:

 $files = array('wp-settings.php', 'wp-load.php');
 $patterns = array('wp-admin', 'wp-includes');
 $replace = array('admin', 'includes');
 wp_settings_edit($files, $patterns, $replace); 

1 个答案:

答案 0 :(得分:1)

除非您的文件非常大(如数百兆字节),否则您肯定不会遇到内存限制。但是,您这样做的效率很低。

您在两个搜索和替换数组上同时运行一个foreach循环,从而使文件写入次数呈指数增长。如果str_replace()仅接受字符串参数,则可以摆脱这些循环之一。但是,它接受数组参数,因此您可以摆脱这两个参数。

function wp_settings_edit(array $filename, array $patterns, array $replace){
    foreach($filename as $file){
        $wp_file = file_get_contents(__DIR__ . "/$file");
        file_put_contents(__DIR__ . "/$file", str_replace($patterns, $replace, $wp_file));
    }
}

这将提高效率,而且,它将实际上完成您想要的工作。通过像在原始代码中那样对两个数组进行嵌套循环,最终将只用替换数组的 first 元素替换搜索数组中的每个项:

$s = ["foo", "bar", "baz"];
$r = ["oof", "rab", "zab"];
$h = "Here is some foo text as well as some bar text and maybe some baz text.";
foreach ($s as $s1) foreach ($r as $r1) $h = str_replace($s1, $r1, $h);
echo $h;

输出:

  

这里有一些oof文本以及一些oof文本,也许还有一些oof文本。