webForumDet fria alternativet

Läsa in fil och ersätta ord i rad innehållandes angivet sökord

PHP

2 svar · 304 visningar · startad av g33k

Medlem sedan okt. 200116 inlägg
Frågan#1

Vi säger att jag har en fil som heter test.log
Denna fil innehåller åtskilliga rader text och jag vill öppna filen för läsning, gå igenom filen rad för rad och om scriptet hittar ett angivet ord i något av raderna ska det gå fram 3 ord (orden separeras som vanligt med blanksteg) och ersätta det tredje ordet efter det angivna sökordet och sedan fortsätta rad för rad.

Hur skulle man gå tillväga för att genomföra detta på enklaste (och scriptmässigt snabbaste) sätt?

Funktionen skulle kunna illustreras på följande sätt.

<?php
function funktionsNamn($fil,$sökord,$ersätt)
{
	öppna filen $fil
	gå igenom rad för rad
	om den hittar $sökord i den aktiva raden
		gå fram till det tredje ordet efter $sökord och ersätt detta med $ersätt
	fortsätt med nästa rad
	stäng filen $fil
	skriv ut hela $fil med tredje ordet efter $sökord ersatt med $ersätt
}

funktionsNamn("fil.log","sökordet","ersättningsordet")
?>

Jag vill med andra ord inte skriva ändringen i filen, bara läsa ut den fast med en viss del av den ersatt då jag vll ha filen intakt som den var från början på servern.

Medlem sedan aug. 20002 975 inlägg
#2

Vad som är snabbast vet jag inte, men det enklaste måste vara att läsa in filen som en sträng i en variabel, och sedan med ett regexp-uttryck som arbetar per rad gå igenom strängen. Något på det här hållet:

$fp = fopen($fil, "r");
$text = fread($fp, filesize($fil));
fclose($fp);

echo preg_replace("/($sökord(\\s[^\\s]+){2}\\s)([^\\s]+)/im", "$1$ersätt", $text);
Medlem sedan okt. 200116 inlägg
#3

Matte skrev:

Vad som är snabbast vet jag inte, men det enklaste måste vara att läsa in filen som en sträng i en variabel, och sedan med ett regexp-uttryck som arbetar per rad gå igenom strängen. Något på det här hållet:

$fp = fopen($fil, "r");
$text = fread($fp, filesize($fil));
fclose($fp);

echo preg_replace("/($sökord(\\s[^\\s]+){2}\\s)([^\\s]+)/im", "$1$ersätt", $text);

Det löste sig.
Att man skulle använda regexp kändes rätt naturligt, dock är just regexp en av mina svagare sidor.

Jag skrev om den du bidrog med en aning och fick allt att fungera precis som jag ville tillsammans med resten av min kod.

Får be och tacka så mycket för hjälpen.

265 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)