Tommi: PHP Suche

hallo leute,

ich hab ein problem.
ich habe mit php einen stream aus einer datei ausgelesen und in
$buffer gespeichert. diesen buffer will ich nun nach eine bestimmten
zeichenkette durchsuchen und bei positivem ergebnis genau die zeile
ausegeben, in der die zeichenkette steht. ist das möglich???

vielen dank schon im vorraus

  1. Hallo!

    ich habe mit php einen stream aus einer datei ausgelesen und in
    $buffer gespeichert. diesen buffer will ich nun nach eine bestimmten
    zeichenkette durchsuchen und bei positivem ergebnis genau die zeile
    ausegeben, in der die zeichenkette steht. ist das möglich???

    Ja! Das ist möglich!

    Wie ist die Struktur der Daten?

    MfG, André Laugks

    --
    L-Andre @ gmx.de
    1. Hallo Andre,

      das ganze sieht so aus:

      while (!feof($sock))
          $buffer .= fgets($sock, 10240);
      fclose($sock);

      vorher wird natürlich erst eine socketverbindung zu einem server geöffnet.

      mit:
      $msg .= nl2br($buffer);
      kann ich sogar dann noch die zeilenubrüche in html-zeilenumbrüche
      ändern.
      dann suche ich eben nach einem schlüsselwort und will dann
      die zeile ausgeben, in der das auftaucht. das wär ja eigentlich nur ein substring vom schlüsselwort bis zum zeilenende (z.B.:<br>).
      Danke

      1. Hallo!

        mit:
        $msg .= nl2br($buffer);
        kann ich sogar dann noch die zeilenubrüche in html-zeilenumbrüche
        ändern.
        dann suche ich eben nach einem schlüsselwort und will dann
        die zeile ausgeben, in der das auftaucht. das wär ja eigentlich nur ein substring vom schlüsselwort bis zum zeilenende (z.B.:<br>).

        Ok, Du könntest alle Zeileumbrüche gehen ein Zeichen ersetzen, meinetwegen "|":

        $buffer = ereg_replace("\n", "|", $buffer);

        Nun splittest Du diesen Dring bei "|":

        $buffer_split = explode("|", $buffer);

        Nun durchläufst Du das Array $buffer_split und durchsuchst jedes einzelne Array-Element.

        for($i = 0; $i < count($buffer_split); $i++)
          {
             if(ereg("suchwort", $buffer_split[$i]))
               {
                  echo $buffer_split[$i];
                  break;
               }
          }

        So könnte das aussehen.

        MfG, André Laugks

        --
        L-Andre @ gmx.de
  2. Hi,

    ich hab ein problem.
    ich habe mit php einen stream aus einer datei ausgelesen und in
    $buffer gespeichert. diesen buffer will ich nun nach eine bestimmten
    zeichenkette durchsuchen und bei positivem ergebnis genau die zeile
    ausegeben, in der die zeichenkette steht. ist das möglich???

    Julians Lösung, nicht getestet, bestimmt ineffizient:
    $string = "Zu suchender String";
    $dateipfad = "[Pfad]";
    $buffer = file($dateipfad);
    for($i=0;$i<count($buffer);$i++)
    {
     if (str_count($buffer[$i],$string) => 1)
      echo $buffer[$i] . "<br>";
    }

    1. Nochwas: Falls du die Datei nicht neu einlesen möchtest (aus irgendeinem Grund),
      kannst kannst du die file()-Zeile weglassen und einfach die Zeichenkette per explode() in ein Array bei \n aufsplitten.

      $string = "Zu suchender String";
      $dateipfad = "[Pfad]";
      $buffer = file($dateipfad);
      for($i=0;$i<count($buffer);$i++)
      {
       if (str_count($buffer[$i],$string) => 1)
        echo $buffer[$i] . "<br>";
      }

      1. hallo, ich weiß nicht genau ob das das ist was ich suche.
        ich hab schon die datei in meinem $buffer kann ich den datentyp dann nicht direkt durchsuchen und im falle eines sucherfolges direkt di zeile ausgeben.
        was ist denn dann dieses $buffer für ein datentyp? ist das ein einfacher string?

        tom

        Nochwas: Falls du die Datei nicht neu einlesen möchtest (aus irgendeinem Grund),
        kannst kannst du die file()-Zeile weglassen und einfach die Zeichenkette per explode() in ein Array bei \n aufsplitten.

        $string = "Zu suchender String";
        $dateipfad = "[Pfad]";
        $buffer = file($dateipfad);
        for($i=0;$i<count($buffer);$i++)
        {
         if (str_count($buffer[$i],$string) => 1)
          echo $buffer[$i] . "<br>";
        }

        1. Hallo,

          Bitte zitiere nur das, worauf Du Dich beziehst,
          und gliedere Dein Posting anstaendig:
          </faq/#Q-09a> und </faq/#Q-09b>
          Und bitte verwende Satzzeichen (Komma, Punkt),
          damit wir Deine Saetze besser lesen und verstehen. Danke.

          ich hab schon die datei in meinem $buffer kann ich den datentyp dann nicht direkt durchsuchen und im falle eines sucherfolges direkt di zeile ausgeben.

          Doch, natuerlich kannst Du.
          Kommt halt darauf an, als was Du den $buffer bearbeitest,
          ob als String oder als Array.

          Die Grundlagen von PHP musst Du schon selbst lernen...

          was ist denn dann dieses $buffer für ein datentyp? ist das ein einfacher string?

          RTFM.
          http://www.php.net/manual/de/ref.filesystem.php
          file() --> Liest eine Datei komplett in ein Array
          file_get_contents() --> Liest die gesamte Datei in einen String (ab PHP 4.3.0)

          Gruesse,

          Thomas

          --
          Dank /my/ automatisch ausgeblendet: JavaScript, ASP.
          Manuell "ausgeblendet": Threads mit Frames, Iframes und Scrollbalken im Subject...
          Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
  3. Hello,

    ich habe mit php einen stream aus einer datei ausgelesen und in
    $buffer gespeichert. diesen buffer will ich nun nach eine bestimmten
    zeichenkette durchsuchen und bei positivem ergebnis genau die zeile
    ausegeben, in der die zeichenkette steht. ist das möglich???

    Hier sollte man aus Performance-Gründen wirklich GENAU überlegen, was man unter "Stream" und undter "Zeile" versteht.

    Datentechnisch betrachtet beinhaltet eine Zeile alle Zeichen nach einem Zeilenanfang bis einschließlich Zeilenendezeichen. Zeilenanfang kann der Dateianfang sein oder das erste Zeichen nach einem Zeilenendezeichen. Die letzte Zeile einer Datei kann auch unvollständig sein, d.h. ohne Zeilenendezeichen. Bei PHP-Dateien, die included werden sollen, MUSS das z.B. so sein.

    Es ist wesentlich schneller, einen Sring in einem Streambuffer zu suchen, als in einem Array aus Zeilen, zumal PHP hier immer noch den Interpreter dazwischen hat...

    In Dateien kann man üblicherweise nicht rückwärts lesen, sodass man dies dann emulieren muss.

    Suche das Vorkommen des Strings im Stream
    Schneide mit fseek() und fread() oder sogar fgets() einen Block rund um den Stringanfang aus. Der Stringanfang sollte in diesem Block einen Offset haben. Vielleicht 1000. Dann lass Dir das letzte Vorkommen des Zeilenendezeichens vor dem Stringanfang listen. http://de3.php.net/manual/en/function.strrpos.php

    Wenn Du mit fgets() gelesen hast, dann läuft Deine Zeile nun von dieser Position bis zum Ende des Ausschnittbuffers.

    Konntst Du mir soweit folgen?

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Hello,

      Wenn Du mit fgets() gelesen hast, dann läuft Deine Zeile nun von dieser Position bis zum Ende des Ausschnittbuffers.

      Bei kleinen Dateien, die Du vollständig einlesen kannst (also bis ca. 2MB) musst Du natürlich nichts ausschneiden, sondern kannst dirket das letzte Vorkommen des Zeilenendezeichens VOR dem Stringanfang [offset] suchen...

      Ich war eben davon ausgegangen, dass man das Vorkommen eines Strings mit Hilfe einer OS-Funktion in einer Datei sucht ... Ist bei sehr großen Dateien die schnellste Lösung.

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen