как заменить определенную строку с помощью php. Я не знаю номер строки. Я хочу заменить строку, содержащую определенное слово.
Один из подходов, который вы можете использовать на небольших файлах, которые могут вписаться в вашу память дважды:
$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'); }
Вы должны перезаписать весь файл.
Итак, для относительно небольшого файла, прочитайте файл в массив , найдите слово, замените найденную строку, напишите все остальное в файл .
Для большого файла алгоритм несколько отличается, но в общем-то совсем и так.
Важная часть – блокировка файлов
поэтому мы предпочитаем базу данных.
Вы также можете использовать многострочный режим с регулярными выражениями
preg_match_all('/word}/m', $textfile, $matches);
это, конечно, предполагает, что это небольшой документ на готовом и загруженном. В противном случае другие ответы гораздо более «реальны» для решения.
$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».
Если вы не знаете эту строку, вам придется искать по всем строкам.
Либо перебирайте файл по строке, либо сразу читайте файл в памяти . Затем либо найдите слово с комбинацией strpos
и str_replace
либо используйте preg_replace
.
Если вы повторяете, просто используйте strpos
и замените строку, если она не вернет FALSE. Затем сохраните файл обратно на диск.
Это хорошо, если вы ищете подстроку (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, кирпичный слой
Может быть, это может помочь:
$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'])) ; }