ich hätte da mal eine Frage betreffend PHP und Dateien.
Ich würde gerne ein Script schreiben, dass mir nach einem Suchbegriff (Input-Feld) in einer Datei sucht…
Das ganze sollte etwas komplexer bzw. intelligenter sein - nämlich es soll mit and, or, not und Klammern umgehen können.
Das and, or, not ist ja kein Problem…
Nur wie löse ich das ganze jetzt mit Klammern?
Ich gehe die Sache folgendermaßen an…
Searchstring kommt über das Input Feld, wird anhang von and or oder not mit explode zerlegt und jenachdem dann danach gesucht…
Nur wich mache ich jetzt das mit Klammern da muss ich nach dem exploden bzw. ausschneiden (…Inhalt…).
Ein Beispiel:
(rot and gelb) or grün
rot and (gelb or grün)
2 Dinge die anhang ihrer Klammern komplett unterschiedlich sind.
Die Datei wird Zeilenweise eingelesen und Zeile für Zeile ausgegeben, wurde in einer Zeile etwas gefunden, wird die Zeile ausgegeben…
Ehrlich gesagt weis ich nicht wie ich diese Dinger einsetzen soll in meinem Fall?!
Ich meine valid-eMail Überprüfungen usw. sind kein Problem, nur wie hilft mir das bei meinem Problem (kleiner Denkanstoß ).
Bzw. helfen mir die dann auch bei meinem and, or, not problem oder nur bei den Klammern?
Jetzt löse ich das mit den and usw. mit einigen umständlichen if’s…
Bzw. kann es ja auch der Fall sein dass entweder gar keine Klammern verwendet wurden oder kein Verknüpfungsoperator…
…also wenn nur nach einem einzelnen Wort gesucht wurde…
also wie müsste ich das jetzt angehen dass ich z.B.:
(rot and grün) or blau
richtig in 3 Wörter zerlege und auf and/or achte…
Hab mir gedacht:
Schritt: Klammern entfernen und inhalte in Array speichern
Schritt: nach den 3 Schlüsselwörtern (and, not, or) suchen und richtig abarbeiten…
Da solltest du dir überlegen, ob nicht etwa das schreiben in eine DB sinnvoller ist
Du kannst dem User auch anbieten direkt einen RegEx einzutragen, was unter Umständen sinnvoll sein könnte.
Egal wie du es machst, das hier wäre die Lösung wenn du den RegEx hast:
function find($string, $line)
{
global $results, $filter;
if(preg_match($filter, $string))
$results[] = $line;
}
$lines =file("datei.log");
$results = array();
$filter = "/test/i"; //Regex bauen
array_walk($lines, 'find');
print_r($results); //Enthält Array mit Zeilenindexen
Denn ich weis nicht wann er and eingibt, als drittes Wort oder zweites oder gar nicht…
Gibt es den irgendeine Möglichkeit eines “explodes” woch ich nicht einen delimiter abgebe sondern zwei und das zwischen den zwei ‘Trennern’ wird dann in ein Array gespeichert?
Oder einen Work Arround dafür?
Reguläre Ausdrücke bieten dir natürlich mehr Möglichkeiten, als ein simples explode.
(Ich meine in der Hinsicht wie Michis Vorschlag, sie direkt zum Suchen zu benutzen - sondern um damit erst mal einen “Parser” zu schreiben, der die Eingabe analysiert und in “Code” zum Durchführen einer Suche umsetzt.)
Eingabe: xyz and abc and dsf OR yxy or tztz and lale
Array (
[0] => xyz
[1] => abc
[2] => dsf OR yxy or tztz
[3] => lale
)
Wie gehe ich jetzt am besten weiter vor damit ich am Ende folgende Bedingung bekomme:
if (eregi($andteile[0], $file[$i]) && eregi($andteile[1], $file[$i])…)
natürlich müsste die if Abfrage dynamisch sein sie enthält entweder 1 eregi() oder X eregi() getrennt durch AND/OR.
Mein Problem ist jetzt wie baue ich die if Abfrage dynamisch auf?#
Bzw. vorher muss ich noch die OR herausbringen…
Das Problem ist, dass du pro Suchanfrage dann 5 Suchabfragen hast, was natürlich langsamer sein kann.
Außerdem ist AND sowiso wegfällig, da die Wörter ja schon mit AND verbunden sind. Wofür du OR und Klammern brauchst, ist mir sowiso noch nicht ganz schlüssig
Warscheinlich kannst du es mit so einem Array-Aufbau lösen:
So…jetzt habe ich nochmals alles über den Haufen geworfen und nochmals begonnen, nur diesmal scheint es fast vollendet.
Ein OR benötige ich wenn ich nur einen der zwei Sachen finden will.
Also wenn zB in einer Zeile rot vorkommt und in der anderen blau (rot OR blau) dann gibt er mir beide Zeilen aus…
Meine derzeitige, etwas einfacher gelöste Methode:
*) 5 input Felder und daneben Radio-Buttons.
*) In das input-Feld wird klarerweise der Suchbegriff eingegeben
*) Bei den Radio-Buttons kann man dann den Operator anklicken (and, or, not)
Ablauf:
Input Felder mittels Schleife ausgeben
3 Arrays anlegen und befüllen ($filledkriterium, $searchstrings, $operator)
…$filledkriterium = true/false -> jenachdem ob im input was eingegeben wurde
…$searchstrings = Der Inhalt des input-Feldes
…$operator = Das Value der Radio Buttons (and, or, not)
Nur müsste diese Abfrage: if(eregi($searchstring, $file[$i])) jetzt dynamisch gestaltet sein…
$searchstring müsste mittels Schleife vom Array ausgelesen werden, $i kommt eh aus der Schleife.
Und jetzt das Schwierigere nach der eregi() Methode muss evtl. ein OPERATOR kommen und danach nochmals ein eregi() usw…
Kann dann zB so aussehen:
if (eregi($searchstring[1], $file[$i]) AND $searchstring[2], $file[$i]) OR $searchstring[3], $file[$i]))
[/quote]
Gut das Array so auf zu bauen sollte kein Problem darstellen.
[quote=“michi7x7”]
Das ganze könntest du dann rekursiv durchgehen:
function check($on, $search_array)
{
$type = $search_array['type']; //Array Typ ermitteln
$len = size($search_array) -1; //Arraygröße ermitteln
for($i=0; $i<$len; $i++)
{
if(is_array($search_array[$i)) //Wenn das aktuelle Array-Element ein Array ist?!
$found = check($on, $search_array[$i]) //ab hier durchblicke ich nicht mehr ganz :S
else
$found = (strpos($on, $search_array[$i]) !== FALSE);
if($found && $type == "OR") return true;
if(!$found && $type == "AND") return false;
}
return ($type == "AND");
}
[/quote]
Dem Parameter $search_array übergebe ich klarerweise das zu durchsuchende Array, nur was übergebe ich dem Parameter $on?
Und wie muss ich dann weiter vorgehen?
Oder ist hier die Suche in der Datei schon integriert? - Ich durchblicke den Code nicht so recht…
Hab ich aber eh in im Code als Kommentar dazugeschrieben…