PHP Suche
Tommi
- php
0 André Laugks0 Tommi
0 Julian von Mendel0 Tom0 Tom
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
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
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
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
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>";
}
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>";
}
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>";
}
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
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
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