我有此功能,可以搜索和替换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);
答案 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文本。