Avatar billede kemijohn Nybegynder
05. oktober 2004 - 11:54 Der er 37 kommentarer og
1 løsning

søge efter linier i XML/txt filer

Jeg skal bruge et PHP script der kan finde nogle bestemte linier i enten en XML fil eller txt fil (alt efter hvad der er nemmest at lave)

Jeg kan få PHP til at åbne filen, og printe hele indholdet.. men jeg kan IKKE få den til kun at printe de linier jeg ønsker.. hvordan gør jeg det ?!?

det er lige meget om den finder linierne ved at tage et bestemt linie nummer, eller den søger efter ord, og printer linierne hvor de ord er i, det vil virke på begge måder, det er bare med hvordan det kan lade sig gøre...

er der nogen der kan hjælpe mig?
Avatar billede bojo Nybegynder
05. oktober 2004 - 13:15 #1
<?php
$handle = fopen("/inputfile.txt", "r");
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    if( substr($buffer,"her", 3)
      echo $buffer;
}
fclose($handle);
?>
Avatar billede coderdk Praktikant
05. oktober 2004 - 18:41 #2
<?php

  $linjer = file( "filen.txt" );
  foreach ( $linjer as $linje )
  {
    if ( in_array( $linje, $soegefter ) )
    {
      echo "Fandt: $linje<br>\n";
    }
  }

?>
Avatar billede coderdk Praktikant
05. oktober 2004 - 18:41 #3
glemte lige at definere $soegefter...

$soegefter = array( "hat", "en linie", "tres", "leet" );
Avatar billede Slettet bruger
05. oktober 2004 - 19:06 #4
Det lyder som om du er ved at lave en konfigurationsfil? Hvad med en modificeret udgave af coderdks:

<?php

  $linjer = file( "filen.txt" );
  foreach ( $linjer as $linje )
  {
    if ( preg_match('/(\w+)\*?=\s*(.*)\s*$/',$linje, $fundet ) )
    {
      $conf[$fundet[1]]=$fundet[2];
    }
  }

?>


Hvis den bliver fodret med følgende tekst:

db_server  =  localhost
db_user    =  sandbox

vil den lave et array ligesom følgende kode:

$conf['db_server']='localhost'
$conf['db_user']='sandbox';

Alle linier i tekstfilen, der ikke starter med et bogstav, tal eller _ vil blive ignoreret.
Avatar billede coderdk Praktikant
05. oktober 2004 - 19:08 #5
heheh sandbox, så kunne man jo bare bruge parse_ini_file()

http://dk2.php.net/parse_ini_file

:)
Avatar billede Slettet bruger
05. oktober 2004 - 19:12 #6
Ja, det ville jo nok være smartere.
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 08:19 #7
Bojo:
Parse error: parse error, unexpected T_ECHO in blah.php on line 6
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 08:21 #8
coderdk:
Den printer ikke noget..
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 08:32 #9
Bojo:
fik det til at virke nu, men den printer bare hele filen...

<?php
$handle = fopen("test.txt", "r");
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    if( substr($buffer,"her", 3) ) {
        echo $buffer;
    }
}
fclose($handle);
?>
Avatar billede bojo Nybegynder
06. oktober 2004 - 09:15 #10
Det tester jeg lige
Avatar billede bojo Nybegynder
06. oktober 2004 - 09:25 #11
ups - en "lille" bøf, jeg har givet forkert version af filen :-)

<?php
$handle = fopen("test.txt", "r");
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    if( substr($buffer,"her",0 , 3) == "her" ) {
        echo $buffer;
    }
}
fclose($handle);
?>
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 09:29 #12
nu skriver den:

Warning: Wrong parameter count for substr() in blah.php on line 5

en helvedes masse gange
Avatar billede bojo Nybegynder
06. oktober 2004 - 09:38 #13
ehhhh - jeg er sq dum - godmorgen - "her" høre ikke til i substr

<?php
$handle = fopen("test.txt", "r");
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    if( substr($buffer,0 , 3) == "her" ) {
        echo $buffer;
    }
}
fclose($handle);
?>
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 09:44 #14
nu får jeg ingen fejl..

men den printer bare intet..




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=windows-1252"></HEAD>
<BODY></BODY></HTML>


det er hvad der står i kilden
Avatar billede bojo Nybegynder
06. oktober 2004 - 10:21 #15
hmmmm - jeg har nu lavet det som t.php der læser sig selv og finder den linie der starter med "echo"

<?php
$handle = fopen("t.php", "r");
if( $handle ) {
    stream_set_timeout($handle, 2);
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        if( substr($buffer,0 , 4) == "echo" ) {
            echo $buffer;
        }
        else
            echo "nææ ".substr($buffer,0,4)."<br>";
    }
echo("her");
    fclose($handle);
}
?>
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 10:25 #16
ja nu skriver den så bare

nææ ----
nææ Syst
nææ ----
nææ Time
nææ
<mange flere linier her>

nææ + de 4 første tegn i en linie
Avatar billede bojo Nybegynder
06. oktober 2004 - 10:39 #17
hmm - min skriver

nææ nææ $han
nææ if(
nææ str
nææ whi
nææ
nææ
nææ
nææ
nææ
nææ
nææ }
echo("her"); nææ fcl
nææ }
nææ ?>
her




hvor echo("her"); nææ fcl er den linie ( + næste linie :-( ) den finder
Avatar billede bojo Nybegynder
06. oktober 2004 - 10:40 #18
denne skriver kun den fundne linie

<?php
$handle = fopen("t.php", "r");
if( $handle ) {
    stream_set_timeout($handle, 2);
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        if( substr($buffer,0 , 4) == "echo" ) {
            echo $buffer;
        }
    }
echo("");
    fclose($handle);
}
?>
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 10:57 #19
hmmm

men den finder ikke noget :/
Avatar billede bojo Nybegynder
06. oktober 2004 - 11:12 #20
det var s*  - du upper den som t.php ??
Avatar billede coderdk Praktikant
06. oktober 2004 - 11:24 #21
Gem flg. som test.php:

<?php

  $linjer = file( "test.php" );
  foreach ( $linjer as $linje )
  {
    if ( preg_match( "/foreach/", $linje ) )
    {
      echo "Denne linje indeholder 'foreach': $linje<br>\n";
    }
  }

?>
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 11:51 #22
Denne linje indeholder 'foreach': foreach ( $linjer as $linje )
Denne linje indeholder 'foreach': if ( preg_match( "/foreach/", $linje ) )
Denne linje indeholder 'foreach': echo "Denne linje indeholder 'foreach': $linje
\n";
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 11:52 #23
bojo:
den skal jo søge i en txt fil
Avatar billede bojo Nybegynder
06. oktober 2004 - 11:59 #24
ja, det er kun for testens skyld jeg lader den søge i sig selv, så ved jeg den såger efter noget der findes, ret filnavnet samt det der søges efter.
Avatar billede bojo Nybegynder
06. oktober 2004 - 11:59 #25
kemijohn < de 3 svar er rigtige da foreach jo står 3 gange i filen :-)
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 12:02 #26
bojo:
så skriver den:

echo("");
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 12:02 #27
det virker åbenbart ikke når man søger i en txt fil :/
Avatar billede bojo Nybegynder
06. oktober 2004 - 12:03 #28
jo, her.

Tag coderdk's løsning så - ret filnavnet samt det der søges efter
Avatar billede bojo Nybegynder
06. oktober 2004 - 12:04 #29
øhh - har du angivet filnavnet rigtigt, men "fuld" sti til filen hvis den ikke er i samme folder som scriptet du køre
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 12:31 #30
stien er go' nok
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 12:32 #31
ah :P

coderdk's virker nu...
Avatar billede bojo Nybegynder
06. oktober 2004 - 12:33 #32
sært, men tag coderdk's når nu min ikke vil hos dig :-)
Avatar billede coderdk Praktikant
06. oktober 2004 - 12:38 #33
Svar ;-)
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 12:39 #34
okay :)

nu har jeg sat det til at finde "Time", og så finder det "Time of this report: 9/28/2004, 14:59:55" og printer denne linie.. det er også godt nok...
men kan jeg på en eller anden måde få den til at skule "Time of this report:" så den kun skriver "9/28/2004, 14:59:55"

??
Avatar billede coderdk Praktikant
06. oktober 2004 - 12:42 #35
Ændr:

    if ( preg_match( "/foreach/", $linje ) )
    {
      echo "Denne linje indeholder 'foreach': $linje<br>\n";
    }

Til:

    if ( preg_match( "/Time of this report: (.*?)/", $linje, $match ) )
    {
      echo "$match[1]<br>\n";
    }
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 12:44 #36
så printer den bare: <br>
Avatar billede coderdk Praktikant
06. oktober 2004 - 12:53 #37
Hmm dette eksempel skulle gerne virke:

<?php

$text = <<<STOP
lille peter edderkop
kravled' op ad muren
Time of this report: 9/28/2004, 14:59:55
så kom solen
og tørred' peters krop
Time of this report: 10/01/2004, 12:51:02
STOP;

    $linjer = explode( "\n", $text );

    foreach ( $linjer as $linje )
    {
        if ( preg_match( "/Time of this report: (.*)/", $linje, $match ) )
        {
          echo "$match[1]<br>\n";
        }
    }
   
?>

Så dette burde også virke:

<?php

    $linjer = file( "dinfil.txt" );

    foreach ( $linjer as $linje )
    {
        if ( preg_match( "/Time of this report: (.*)/", $linje, $match ) )
        {
          echo "$match[1]<br>\n";
        }
    }
   
?>
Avatar billede kemijohn Nybegynder
06. oktober 2004 - 13:03 #38
jo jo :D

det virker.. mange tak for hjælpen :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester