0

ファイル内の文字列の複数の部分を。に置き換えようとしていますfile_put_contents。基本的に、関数が行うことは、ファイル内の特定のフレーズを検索することです(これは、$newおよび$old配列内にあり、それを置き換えます。

$file_path = "hello.txt";
$file_string = file_get_contents($file_path);
function replace_string_in_file($replace_old, $replace_new) {
    global $file_string; global $file_path;
    if(is_array($replace_old)) {
        for($i = 0; $i < count($replace_old); $i++) {
            $replace = str_replace($replace_old[$i], $replace_new[$i], $file_string);
            file_put_contents($file_path, $replace); // overwrite
        }
    }
}
$old = array("hello8", "hello9"); // what to look for
$new = array("hello0", "hello3"); // what to replace with
replace_string_in_file($old, $new);

hello.txtは次のとおりです。hello8 hello1 hello2 hello9

残念ながら、次のように出力されます。hello8 hello1 hello2 hello3

したがって、2を出力する必要があるときに、1つの変更のみを出力します。 hello0 hello1 hello2 hello3

4

2 に答える 2

4

これは単一のファイルなので、置換するたびに出力するのはなぜですか?ワークフローは次のようになります

a) read in file
b) do all replacements
c) write out modified file

つまり、file_put_contents()をループの外側に移動します。

同様に、str_replaceは、「todo」および「replacewith」配列の配列を受け入れます。入力をループする必要はありません。だから基本的にあなたは持っているべきです

$old = array(...);
$new = array(...);

$text = file_get_contents(...);
$modified = str_replace($old, $new, $text);
file_put_contents($modified, ....);

あなたの主な問題は、あなたが書いたように、あなたのstr_replaceが更新された文字列を決して使用していないということです。置換ごとに常に同じORIGINAL文字列を使用します。

$replace = str_replace($replace_old[$i], $replace_new[$i], $file_string); 
                                                            ^^^^^^^^^^^---should be $replace
于 2012-09-05T18:30:15.097 に答える
0

反復ごとに$file_stringを更新するわけではありません。つまり、ループの開始時に1回設定し、最初のペアを置き換えてから、2回目の置換呼び出しで元の$file_stringを再度使用します。

于 2012-09-05T18:30:20.107 に答える