Здравствуйте. У меня есть проблема с функцией str_replace(), которая, по-видимому, заменяет значения только в файлах с расширением .xml. Можете ли вы помочь мне разобраться с этим? Вот пример кода:
<pre><code class="php"><?php
$files_parameters = [
[
'name' => 'uploads/loaded-3.csv',
'result' => 'uploads/decode-3.csv',
'change-from' => 'Российский рубль',
'change-to' => 'RUB'
]
];
foreach($files_parameters as $file) {
if (file_exists($file['name'])) {
$source = @fopen($file['name'],'r');
if ($source) {
$target = @fopen($file['result'],'w+');
$f = 0;
while (!@feof($source)) {
$st = @fgets($source, 4096);
$pos = strpos($st, $file['change-from']);
if ($pos or $f) {
$st = str_replace($file['result'], $file['change-to'], $st);
if (substr_count($st, '</param>')) {
$f = 0;
$st = str_replace('param', 'art', $st);
} else $f = 1;
}
fwrite($target, $st);
}
@fclose($source);
@fclose($target);
}
}
}
?></code></pre>
В вашем коде есть несколько моментов, которые требуют исправления, чтобы текст в файле .csv заменялся корректно. Прежде всего, вы неправильно используете функцию `str_replace`. Вместо поиска строки `change-from` вы случайно ищете значение `result`, которое является именем выходного файла.
Вот обновленный пример кода, который исправляет эту проблему:
```php
<?php
$files_parameters = [
[
'name' => 'uploads/loaded-3.csv',
'result' => 'uploads/decode-3.csv',
'change-from' => 'Российский рубль',
'change-to' => 'RUB'
]
];
foreach($files_parameters as $file) {
if (file_exists($file['name'])) {
$source = @fopen($file['name'], 'r');
if ($source) {
$target = @fopen($file['result'], 'w+');
if ($target) {
while (!@feof($source)) {
$st = @fgets($source, 4096);
// Правильная замена:
$st = str_replace($file['change-from'], $file['change-to'], $st);
// Здесь мы можем добавить дополнительные условия для замены
if (substr_count($st, '</param>')) {
$st = str_replace('param', 'art', $st);
}
fwrite($target, $st);
}
@fclose($source);
@fclose($target);
} else {
echo "Не удалось открыть файл для записи: " . $file['result'];
}
} else {
echo "Не удалось открыть файл для чтения: " . $file['name'];
}
} else {
echo "Файл не существует: " . $file['name'];
}
}
?>
```
### Основные изменения:
1. **Корректная замена**: В строке `str_replace` замените значение `result` на `change-from`.
2. **Проверка на успешное открытие целевого файла**: Добавлена проверка, чтобы убедиться, что целевой файл открывается успешно.
3. **Сообщения об ошибках**: Добавлены сообщения об ошибках в случае, если не удается открыть файл для чтения или записи.
Теперь этот код должен корректно заменять текст в файле .csv, как вы и ожидаете.
Угу. Сначала понаставим @, чтобы скрыть все ошибки, а потом будем голову ломать, почему ничего не работает и ошибок не показывает.
А вообще, это делается в одну строку.
file_put_contents($outfilename, str_replace('Российский рубль', 'RUB', file_get_contents($infilename)));