Замена строки в нескольких файлах - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть эта функция, которая будет искать и заменять данный термин в 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 голосов
/ 21 ноября 2018

Если ваши файлы не очень большие - например, сотни мегабайт - вы, конечно, не ограничиваетесь в памяти.Однако вы делаете это довольно неэффективно.

Вы запускаете цикл 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));
    }
}

Это повысит эффективность и, более того, фактически выполнит ту работу, которую вы хотите.Выполнив вложенный цикл над обоими массивами, как в исходном коде, вы в конечном итоге замените каждый элемент в массиве поиска только на первый элемент массива замен:

$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;

Вывод:

Вот некоторые тексты, а также тексты и, возможно, тексты.

...