Как заменить конкретную строку в текстовом файле с помощью PHP? - PullRequest
35 голосов
/ 09 июня 2010

как заменить конкретную строку с помощью php.Я не знаю номер строки.Я хочу заменить строку, содержащую определенное слово.

Ответы [ 9 ]

51 голосов
/ 09 июня 2010

Один подход, который вы можете использовать для небольших файлов, которые могут уместиться в вашей памяти дважды:

$data = file('myfile'); // reads an array of lines
function replace_a_line($data) {
   if (stristr($data, 'certain word')) {
     return "replaement line!\n";
   }
   return $data;
}
$data = array_map('replace_a_line',$data);
file_put_contents('myfile', implode('', $data));

Небольшое примечание, PHP> 5.3.0 поддерживает лямбда-функции, поэтому вы можете удалить объявление именованной функции и сократить карту до:

$data = array_map(function($data) {
  return stristr($data,'certain word') ? "replacement line\n" : $data;
}, $data);

Теоретически вы можете сделать это единственное (сложнее следовать) выражение php:

file_put_contents('myfile', implode('', 
  array_map(function($data) {
    return stristr($data,'certain word') ? "replacement line\n" : $data;
  }, file('myfile'))
));

Другой (менее требовательный к памяти) подход, который следует использовать для больших файлов:

$reading = fopen('myfile', 'r');
$writing = fopen('myfile.tmp', 'w');

$replaced = false;

while (!feof($reading)) {
  $line = fgets($reading);
  if (stristr($line,'certain word')) {
    $line = "replacement line!\n";
    $replaced = true;
  }
  fputs($writing, $line);
}
fclose($reading); fclose($writing);
// might as well not overwrite the file if we didn't replace anything
if ($replaced) 
{
  rename('myfile.tmp', 'myfile');
} else {
  unlink('myfile.tmp');
}
7 голосов
/ 09 июня 2010

Вы должны перезаписать весь файл.

Итак, для сравнительно небольшого файла считывание файла в массив , поиск слова, замена найденной строки, запись всех остальных в файл

Для большого файла алгоритм немного другой, но в целом он такой же.

Важной частью является блокировка файла

именно поэтому мы предпочитаем базу данных.

3 голосов
/ 09 июня 2010

Вы также можете использовать многострочный режим с регулярными выражениями

preg_match_all('/word}/m', $textfile, $matches);

это, конечно, при условии, что это готовый и загруженный документ меньшего размера. В противном случае другие ответы являются гораздо более «реальным» решением.

2 голосов
/ 09 июня 2010
$filedata = file('filename');
$newdata = array();
$lookfor = 'replaceme';
$newtext = 'withme';

foreach ($filedata as $filerow) {
  if (strstr($filerow, $lookfor) !== false)
    $filerow = $newtext;
  $newdata[] = $filerow;
}

Теперь $newdata содержит содержимое файла в виде массива (используйте implode(), если вам не нужен массив) со строкой, содержащей "replaceme", замененной на "withme".

1 голос
/ 17 февраля 2017

Это хорошо, если вы ищете подстроку (ID) в строке и хотите заменить старую строку новой строкой.

Код:

$id = "123";
$new_line = "123,Programmer\r"; // We're not changing the ID, so ID 123 remains.
$contents = file_get_contents($dir);
$new_contents= "";
if( strpos($contents, $id) !== false) { // if file contains ID
    $contents_array = preg_split("/\\r\\n|\\r|\\n/", $contents);
    foreach ($contents_array as &$record) {    // for each line
        if (strpos($record, $id) !== false) { // if we have found the correct line
            $new_contents .= $new_line; // change record to new record
        }else{
            $new_contents .= $record . "\r";
        }
    }
    file_put_contents($dir, $new_contents); // save the records to the file
    echo json_encode("Successfully updated record!");
}
else{
    echo json_encode("failed - user ID ". $id ." doesn't exist!");
}

Пример:

Старый файл:

ID, род занятий

123, студент

124, слой кирпича

Запуск кода изменит файл на:

Новый файл:

ID, род занятий

123, программист

124, слой кирпича

1 голос
/ 09 июня 2010

Если вы не знаете строку, вам придется искать по всем строкам.

Либо перебирать строку файла по строке или читать файл в памятьвсе сразу .Затем либо найдите слово с комбинацией strpos и str_replace, либо используйте preg_replace.

Если вы выполняете итерацию, просто используйте strpos и замените строку, если она не вернула FALSE.Затем сохраните файл обратно на диск.

0 голосов
/ 14 апреля 2018

Вы можете сделать так:

$file = file('data.txt'); 
$data = 'new text';
$some_index = 2;
foreach($file as $index => $line){

   if($index == $some_index){
       $file[$index] = $data . "\n";
   }

}

$content = implode($file);
file_put_contents('data.txt', $content);
0 голосов
/ 20 марта 2018

Вы можете превратить файл в массив, используя функцию explode();, редактировать любой элемент в массиве, использовать функцию implode();, чтобы превратить массив обратно в строку, затем вы можете поместить строку обратно в файлиспользуя функцию file_put_contents();.Это показано в следующей функции:

function file_edit_contents($file_name, $line, $new_value){
  $file = explode("\n", rtrim(file_get_contents($file_name)));
  $file[$line] = $new_value;
  $file = implode("\n", $file);
  file_put_contents($file_name, $file);
}
0 голосов
/ 19 апреля 2016

Может быть, это может помочь:

$data = file("data.php");

for($i = 0;$i<count($data);$i++){
    echo "<form action='index.php' method='post'>";
    echo "<input type='text' value='$data[$i]' name='id[]'><br>";
}

echo "<input type='submit' value='simpan'>";
echo "</form>";

if(isset($_POST['id'])){
    file_put_contents('data.php',implode("\n",$_POST['id'])) ;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...