Datei nach Tags durchsuchen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
attribut
ausgabe
auslese
code
datei
dom
durchsuchen
file
http
klappen
match
null
objekt
struktur
tag
text
url
variable text
welt
-
Hallo @ all
Ich habe ein Problem
und zwar möchte ich eine tag/datei">Datei einlesen und durchsuchen.
suchen möchte ich nach tags (Bsp. <tagname atribut="wert" />)
Der Tagname ist bekannt. Das Attribut auch, ich brauche nur den Wert.
Zusätzlich brauche ich noch die Anzahl der Vorkommnisse des vollständigen tags.
Ich weiss zwar ungefähr wie ich einzelne Sachen lösen kann, aber als gesammtpaket finde ich nicht den richtigen Weg.
Hier mal was ich bis jetzt habe:
# auslesen der Date $fp = fopen("file.php","r"); if ($fp){while(!feof($fp)) {$text = fgets($fp);$text=$text.$text;} fclose($fp);}
Meine Datei sollte jetzt also in der Variable $text sein.
Als nächstes muss ich sie durchsuchen.
Ich kenne zwar preg_match oder ereg und so.
Aber damit kann ich ja nur nach einem String suchen, der auch nur einmal vorkommt oder?
Und der TAg kommt bei mir ja mehrmals vor.
Auch das Auslesen des Attributes. Ich habe keine Ahnung wie ich das machen soll.
Ich hoffe Ihr könnt mir helfen
MFG
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
<?php $text = '<tagname attribut="test1">Hallo Welt<tagname attribut="test2">!'; preg_match_all('/<tagname attribut="(.*?)">/is', $text, $matches, PREG_SET_ORDER); echo '<pre>'; print_r($matches); echo '</pre>'; ?>
Beitrag zuletzt geändert: 5.4.2011 20:08:29 von fabo -
Hallo buddix,
nachdem Deine Datei ja XML-Daten enthält, kannst Du sie auch mit simplexml_load_file() laden. Damit sparst Du Dir wahrscheinlich einen Haufen Arbeit.
Eine kurze Einführung dazu findest Du hier.
Und eine etwas ausführlichere hier und hier.
Beitrag zuletzt geändert: 5.4.2011 20:09:22 von darkpandemic -
Ja das hatte ich auch zuerst vor...
Aber @ fabo
vielen Dank, das klappt so im groben.
Ich verstehe nur die Struktur von $matches nicht so ganz.
Ansonsten schein alles zu klappen, vielen Dank! Hatte die Hoffnung nach einer regulären Function schon aufgegeben.
Wäre cool wenn du mir gerade noch die Struktur des arrays erklären könntest, damit ich gezielt auslesen kann.
MFG buddix -
PREG_SET_ORDER
Ordnet die Ergebnisse so an, dass $matches[0] ein Array aus dem ersten Satz von Übereinstimmungen ist, $matches[1] ein Array aus dem zweiten Satz von Übereinstimmungen und so weiter.
Du könntest dir aus dem Array ein neues Array bauen:
<?php $arr = null; $text = '<tagname attribut="test1">Hallo Welt<tagname attribut="test2">!'; preg_match_all('/<tagname attribut="(.*?)">/is', $text, $matches, PREG_SET_ORDER); foreach($matches as $match) { $arr = $match[1]; } ?>
So erhälst du das Array $arr und dies wiederrum enthält lediglich die gefilterten Attribute.
Oder du benutzt DOMDocument, was für dein Vorhaben evtl. sogar geeigneter wäre.
<?php $arr = null; $text = file_get_contents('file.php'); $dom = new DOMDocument; @$dom->loadHTML($text); $tags = $dom->getElementsByTagName('tagname'); foreach ($tags as $tag){ echo $link->getAttribute('attribut'); } ?>
Beitrag zuletzt geändert: 5.4.2011 20:45:49 von fabo -
Hey
Das sieht super aus, und wäre eine viel sauberere und schönere und auch übersichtlicherere Lösung, nur woher kommt das Objekt $link? Ich habe versucht $tag stat $link zu nehmen aber dann bekomme ich keine Ausgabe.
MFG
edit: Kann es sein, dass LoadHTML nicht bei php klappt?
Beitrag zuletzt geändert: 5.4.2011 21:06:14 von buddix -
Du hast du Recht: $link sollte $tag heißen.
Ich hab vor lauter Eile sowieso ein paar Fehler rein gehauen =)
<?php $arr = array(); $tags = array(); $text = file_get_contents('file.php'); $dom = new DOMDocument; @$dom->loadHTML($text); $tags = $dom->getElementsByTagName('tagname'); foreach ($tags as $tag){ $arr[] = $tag->getAttribute('attribut'); } echo '<pre>'; print_r($arr); echo '</pre>'; ?>
So, das zum Einen. Das Ganze funktioniert so nur mit externen Dateien oder lokalen HTML-Dateien (wobei man hier dann loadHTMLFile() verwendet). Das liegt an file_get_contents. Was du bei lokalen PHP-Dateien tun könntest, wäre dich des Output-Buffers zu bemächtigen d.h. du inkludierst die PHP-Datei, schreibst die Ausgabe in die Variable $text und verwendest dies dann als DOM-Objekt.
<?php ob_start(); include('file.php'); $text = ob_get_contents(); ob_end_clean(); $arr = array(); $tags = array(); $dom = new DOMDocument; @$dom->loadHTML($text); $tags = $dom->getElementsByTagName('tagname'); foreach ($tags as $tag){ $arr[] = $tag->getAttribute('attribut'); } echo '<pre>'; print_r($arr); echo '</pre>'; ?>
So, oder so ähnlich wirds klappen =)
Beitrag zuletzt geändert: 6.4.2011 0:57:22 von fabo -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage