webForumDet fria alternativet

Filhantering och regexp

2 svar · 341 visningar · startad av Qimen

QimenMedlem sedan juni 20015 009 inlägg
#1

Hej,

Jag har en fil som innehar rader liknande denna:

-> 2006-09-17 22:23:28 [PAGE="/fil.tmp"] [LINE="1"] [CODE="1"] [MSG="A"] [USER="A"] [X="1"]

Det jag vill göra nu är att plocka ut sista raden, kolla dess värde i "CODE=" och om det är samma som min variabel $var ska jag uppdatera "X=" till X+1. Har suttit en stund och försökt få rätt på det och lyckats ta ut sista raden och kolla om det är samma värde i CODE men sen tar det stopp. Vet inte riktigt hur jag ska uppdatera X-värdet. Om jag ska ta bort den gamla raden och lägga till en ny eller om det går att uppdatera den gamla.

En tanke var att om det görs många laddningar av sidan så kanske det uppstår något fel om man försöker hämta och ta bort sista raden. Så kanske bör man först plocka ut sista raden och kolla dess CODE-värde och sedan uppdatera den rad som har just det CODE-värdet med. Då borde man unvidka eventuella fel om någon ny rad läggs till innan vi har hunnit uppdatera vår rad?

Saken är även den att det kan ligga 3 rader i filen där första raden har code-värde 1, andra raden code-värde 2 och den tredje code-värde 1 igen. Då ska bara den senaste uppdateras.

Det jag har testat själv:

$rader = array_reverse(file("fil.txt"));
$rader_c = $rader[0];
ereg("\[CODE=\x22([[:digit:]]+)\x22\]", rtrim($rader_c), $matches);

if ($matches[1] != $this->code)
{
	// Lägg till ny rad
	$string  = "-> " . date("Y-m-d H:i:s") . " 
				[PAGE=\"" . $this->file . "\"] 
				[LINE=\"" . $this->line . "\"] 
				[CODE=\"" . $this->code  ."\"] 
				[MSG=\"" . $this->message  ."\"] 
				[USER=\"" . $log_user . "\"] 
				[X=\"1\"]\n";
	$fp = fopen("fil.txt", "a");
	fputs($fp,$string);
	fclose($fp);

} else {
	// Uppdatera senaste raden med code-värde = $this->code till x++
	ereg("\[X=\x22([[:digit:]]+)\x22\]", rtrim($rader[0]), $matches);
	$matches[1]++;

	// Här skon klämmer
}

Jag är inte så bra på reg_exp, kanske kan man plocka ut både CODE och X i en enda koll? :)

salkciNMedlem sedan sep. 200619 inlägg
#2

Du kan t.ex göra så här:

<?php

$var = 19; // Din $var variabel

$file = file('fil.txt');		// Läs in filen till en array
$key = $file[count($file) - 1];	// Plocka ut sista värdet i arrayen

// Hämta code och x värdena
preg_match_all('/(?<=\[code=")\d+|(?<=\[x=")\d+/i', $key, $match);

$code = $match[0][0];
$x = $match[0][1];

	// Är $code och $var lika? +:a på $x med 1 och uppdatera arrayen
	if ($code == $var) {
	
		$x++;
		$file[count($file) - 1] = preg_replace('/\[x=\"\d+\"]/ie', '"[x=\"" . $x . "\"]"', $key);
		
	}

// Komprimera den uppdaterade arrayen till en sträng
$file = implode($file);

// spara strängen $file till textfilen, klart!
echo $file;

?>
QimenMedlem sedan juni 20015 009 inlägg
#3

Tackar, med den regexpn så löste det sig. :)

139 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)