kostenloser Webspace werbefrei: lima-city


Datei nach Tags durchsuchen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    buddix

    buddix hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. <?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
  4. 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
  5. Autor dieses Themas

    buddix

    buddix hat kostenlosen Webspace.

    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
  6. 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
  7. Autor dieses Themas

    buddix

    buddix hat kostenlosen Webspace.

    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
  8. 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
  9. Autor dieses Themas

    buddix

    buddix hat kostenlosen Webspace.

    Super danke :)
    Klappt so alles. Vielen Dank nochmal,
    MFG Buddix
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!