Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: hjt- login siistiminen

Cartter [10.07.2008 15:01:15]

#

Mikä on yksinkertaisin tapa poistaa tekstitiedostosta tyhjät rivit JA rivit, joissa esiintyy ennalta tiedetty merkkijono.

<?
$crap = "--";

$fc = file("uploads/hijackthis.log");

$f = fopen("uploads/hijackthis.log","w");

foreach($fc as $line){

	if (!strstr($line,$crap)){
		fputs($f,$line);

		echo $line . "<br />";
}
}

fclose($f);
?>

Tuommosella olen koittanut poistaa ne rivit, joissa esiintyy määrätty merkkijono, mutta se ei toimi puhumattakaan tyhjän rivin poistamisesta strstr funktiolla. Antakee pientä vinkkiä. Ensimmäisiä rivejä kirjoittelen php :) Toimisiko tuo preg_match funktio tässä?

Mod. lisäsi kooditagit

Metabolix [10.07.2008 15:05:46]

#

Laita useampia ehtoja ja käännä homma toisin päin:

<?php
foreach ($rivit as $rivi) {
  if (strpos($rivi, $crap) !== false) {
    continue; // Seuraava rivi, tässä on $crap
  }
  if (strlen(trim($rivi)) == 0) {
    continue; // Seuraava rivi, tämä on melkein tyhjä
  }
  # if (...) { continue; }
  # ...
  # Jos mikään ei ollut pielessä, lopulta kirjoitetaan
  fputs($f, $rivi);
}
?>

Jos säännölliset lausekkeet kiinnostavat, voit toki käyttää preg_grep-funktiota, joka poistaa taulukosta osuvat alkiot.

Cartter [10.07.2008 16:18:48]

#

Jes kiitoksia tämä auttoi paljon. Mutta mitä tämä meinaa?:

// Seuraava rivi, tämä on melkein tyhjä

Jos rivin pituus on nolla niin eikö se ole silloin täysin tyhjä?

Toinen kysymys vielä loppuun olisi, että kun annan $crap muuttujalle useita arvoja esim. näin:

$crap = "--" or "End of file";

niin tuo mainitsemasi koodinpätkä ei poista logista tuota "End of file" sanoilla alkavaa riviä. "--" alkavat se kuitenkin poistaa. Siis voiko tuolle muuttujalle antaa tällä tavalla useita arvoja vai teinkö jotain väärin tuossa ylempänä? :)

jlaire [10.07.2008 16:51:59]

#

Cartter kirjoitti:

Jos rivin pituus on nolla niin eikö se ole silloin täysin tyhjä?

Kyllä, mutta Metabolixin esimerkissä ei otetta pituutta suoraan vaan käytetään välissä trim:iä, joten se hylkää täysin tyhjien rivien lisäksi myös rivit, joissa on pelkkiä whitespace-merkkejä.

Cartter kirjoitti:

Siis voiko tuolle muuttujalle antaa tällä tavalla useita arvoja vai teinkö jotain väärin tuossa ylempänä? :)

Ei ihan tuolla tavalla; or palauttaa joko ensimmäisen (jos se on tosi) tai toisen parametrin (jos ensimmäinen on epätosi). PHP:ssä "--":n totuusarvo on tosi, joten or palauttaa sen ja jättää toisen merkkijonon huomiotta.

Voit käyttää taulukkoa ja käydä silmukalla sen jäsenet läpi. Toinen vaihtoehto on säännöllinen lauseke, mutta taulukko on varmaan kätevämpi tässä.

Cartter [10.07.2008 17:53:50]

#

Kiitos funktio. Koitin tuota mainitsemaasi silmuka- ratkaisua:

$crap = array("--", "End of file", "Running processes:");

$rivit = file("uploads/hijackthis.log");

$f = fopen("uploads/hijackthis.log","w");

foreach ($rivit as $rivi) {

	for ($i = 0; $i < count($crap); $i++){
		if (strpos($rivi, $crap[$i]) !== false)
		continue;
		}

	if (strlen(trim($rivi)) == 0)
		continue;

    fputs($f, $rivi);

}

fclose($f);

Eli tuo tyhjän rivin poistaminen toimii hienosti, mutta tuo silmukalla $crap:n solujen läpikäyminen ei muuta mitään.

Tällaiset rivit mm. pitäisi saada poistettua:

--
End of file - 8068 bytes


Missä on vika?

vidar [10.07.2008 19:31:45]

#

Cartter kirjoitti:

for ($i = 0; $i < count($crap); $i++){
	if (strpos($rivi, $crap[$i]) !== false)
		continue;
}

Tuo continue hyppää lähimmän loopin iteraation yli, eli ei tee mitään. Koita continue 2;, vaikken nyt muista, toimiko tuo php:ssä.

EDIT: Manuaalin mukaan pitäisi toimia.

Cartter [10.07.2008 20:16:31]

#

Kiitos Vidar, tuo auttoi :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta