wie man eine bestimmte zeile mit php ersetzt. Ich kenne die Zeilennummer nicht. Ich möchte eine Zeile ersetzen, die ein bestimmtes Wort enthält.
Wie ersetzt man eine bestimmte Zeile in einer Textdatei mit PHP?
gnarf
Ein Ansatz, den Sie für kleinere Dateien verwenden können, die in Ihren Speicher passen zweimal:
$data = file('myfile'); // reads an array of lines
function replace_a_line($data) {
if (stristr($data, 'certain word')) {
return "replacement line!\n";
}
return $data;
}
$data = array_map('replace_a_line',$data);
file_put_contents('myfile', implode('', $data));
Eine kurze Anmerkung, PHP > 5.3.0 unterstützt Lambda-Funktionen, sodass Sie die benannte Funktionsdeklaration entfernen und die Zuordnung kürzen können auf:
$data = array_map(function($data) {
return stristr($data,'certain word') ? "replacement line\n" : $data;
}, $data);
Sie könnten dies theoretisch zu einer einzigen (schwerer zu befolgenden) PHP-Anweisung machen:
file_put_contents('myfile', implode('',
array_map(function($data) {
return stristr($data,'certain word') ? "replacement line\n" : $data;
}, file('myfile'))
));
Ein weiterer (weniger speicherintensiver) Ansatz, den Sie verwenden sollten größere Dateien:
$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');
}
-
Der weniger speicherintensive Ansatz ist genau das, was ich brauchte (einfach und leicht verständlich)…..DANKE!!!
– Benutzer321531
6. Februar 2015 um 21:54 Uhr
-
Um einen Fehler “Zugriff verweigert” zu vermeiden, verwenden Sie Code 5
rename()
nach demfclose()
zu früh, musste ich tunfseek()
auf 0 für beide Griffe, dann verwendenstream_copy_to_stream()
kopieren und dannfclose()
die Handler.– Leopoldo Sanczyk
5. Juli 2019 um 7:39 Uhr
Sie müssen die gesamte Datei überschreiben.
Also, für die relativ kleine Datei, Datei in Array lesenWort suchen, gefundene Zeile ersetzen, schreiben der ganze Rest hinein Datei.
Für die große Datei ist der Algorithmus etwas anders, aber im Allgemeinen ziemlich gleich.
Wichtiger Teil ist Dateisperre
Deshalb bevorzugen wir eine Datenbank.
Sie können den mehrzeiligen Modus auch mit regulären Ausdrücken verwenden
preg_match_all('/word}/m', $textfile, $matches);
Dies setzt natürlich voraus, dass es sich um ein kleineres Dokument handelt, das bereit und geladen ist. Ansonsten sind die anderen Antworten weitaus realer als eine Lösung.
Gordon
Wenn Sie die Zeile nicht kennen, müssen Sie alle Zeilen durchsuchen.
Entweder Zeile für Zeile über die Datei iterieren oder liest die Datei auf einmal in den Speicher. Dann finden Sie das Wort entweder mit einer Kombination von strpos
und str_replace
oder verwenden preg_replace
.
Wenn Sie iterieren, verwenden Sie einfach strpos
und ersetzen Sie die Zeile, sobald sie nicht FALSE zurückgegeben hat. Speichern Sie die Datei dann wieder auf der Festplatte.
$filedata = file('filename');
$newdata = array();
$lookfor="replaceme";
$newtext="withme";
foreach ($filedata as $filerow) {
if (strstr($filerow, $lookfor) !== false)
$filerow = $newtext;
$newdata[] = $filerow;
}
Jetzt $newdata
enthält den Dateiinhalt als Array (verwenden Sie implode()
wenn Sie kein Array möchten) mit der Zeile, die “replaceme” enthält, ersetzt durch “withme”.
Gemeinschaft
Das ist gut, wenn Sie nach einem Teilstring (ID) in einer Zeile suchen und die alte Zeile durch die neue ersetzen möchten.
Code:
$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!");
}
Beispiel:
Alte Datei:
Personalausweis, Beruf
123, Schüler
124, Ziegelschicht
Das Ausführen des Codes ändert die Datei in:
Neue Datei:
Personalausweis, Beruf
123, Programmierer
124, Ziegelschicht
DMVerfurth
Sie können die Datei mit dem in ein Array umwandeln explode();
Funktion, bearbeiten Sie ein beliebiges Element im Array, verwenden Sie die implode();
Funktion, um das Array wieder in einen String umzuwandeln, dann können Sie den String wieder in die Datei einfügen, indem Sie die verwenden file_put_contents();
Funktion. Dies wird in der folgenden Funktion gezeigt:
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);
}