Verschachtelte HTML Tags filtern

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Verschachtelte HTML Tags filtern

    Hallo Allerseits,

    ich habe ein kleines Problem. Ich habe einen String mit HTML Code in dem sich verschachtelte span Tags mit Inhalt befinden. Ich würde gerne rekursiv den Inhalt auslesen weil ich den Inhalt später dynamisch on-the-fly in der Funktion weiterverarbeiten muss.

    PHP-Code:
    <?php
    $eingabe 
    '<span id="74506" class="black">Lorem ipsum dolor sit amet, 
    <span id="74507" class="red">consectetuer</span> adipiscing elit</span>.
    <span id="74535" class="black">Aenean</span> <span id="74536" class="red">commodo</span> 
    ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis  dis parturient montes, 
    nascetur ridiculus mus. Donec quam felis,  ultricies nec, pellentesque eu, pretium quis, sem. Nulla 
    consequat massa  quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate  eget, arcu. In
    enim justo, rhoncus ut, imperdiet a, venenatis vitae,  justo. Nullam dictum felis eu pede mollis pretium.
    Integer tincidunt.  Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend  tellus. 
    Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac,  enim. Aliquam lorem ante, dapibus in, 
    viverra quis, feugiat a, tellus.  Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean
    imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper  ultricies nisi. Nam eget dui. Etiam rhoncus. 
    <span id="74508" class="yellow">Maecenas <span id="74509" class="black">tempus</span>, tellus  eget</span> 
    condimentum rhoncus, sem quam semper libero, sit amet <br /><br />'
    ;
              
    function 
    parseTagsRecursive($eingabe)
    {
      
    $regex '#<span id="[0-9]+" class="[a-zA-Z]+">[a-zA-Z0-9-_.<>\/,\:\"]*</span>#';
      
      if (
    is_array($eingabe)) {
        
    $eingabe '<b><div style="margin-left: 10px">'.$eingabe[1].'</div></b>';
      }

      return 
    preg_replace_callback($regex'parseTagsRecursive'$eingabe);
    }

    $ausgabe parseTagsRecursive($eingabe);

    echo 
    $ausgabe;
    ?>
    Leider ist der Inhalt in $eingabe[1] leider weg, und das äußere span wird nicht mit div ersetzt.

    Bin für Hilfe dankbar.

    Gruß Yvon
    Zuletzt geändert von yfolz; 25.08.2010, 16:47.

  • #2
    Code umbrechen und zwar dalli.

    Peter

    PS: Auf "Ändern" klicken und dann schön brav mit der return-Taste arbeiten
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Hoffe so besser. Sorry!

      Kommentar


      • #4
        1) da ist kein "äußeres" span ... sondern nebeneinander liegende spans ...

        2) wieso sollte deine Zeichenkette eingabe sich plötzlich in ein array verwandeln, ohne das du etwas dafür tust ?

        3) ..entsprechend kennt der kein $eingabe[1] ....

        - das ist natürlich auch der Grund, warum NIE der div-"kram" dazukommt, weil er einfach bei der Abfrage is_array($eingabe) immer zu Erkenntnis "FALSE" kommt ($eingabe ist nunmal keins)
        Code:
        <span id="74506"> 
           <span id="74507"></span>
        </span>
        <span id="74535"></span>
        <span id="74536"></span>
        <span id="74508">
           <span id="74509"></span>
        </span>
        <br/>
        <br/>
        wenn ich mal den Fülltext weglasse, stehen diese Tags da .... vielleich stellst du mal nach diesem Muster dar, welche durch div ersetzt werden sollen

        Sollte ich mich bei Punkt 2 geirrt haben, durch den rekursiven Aufruf ... schau mal in $eingabe[0] nach, was da "drin" steht ...
        Zuletzt geändert von eagle275; 25.08.2010, 17:46.
        [font=Verdana]
        Wer LESEN kann, ist klar im Vorteil!
        [/font]

        Kommentar


        • #5
          Ich habe das hier als Ausgangsbeispiel genommen:

          PHP-Code:
          <?php
          $eingabe 
          "plain[indent] deep[indent] deeper [/indent]deep [/indent]plain";

          function 
          parseTagsRecursive($eingabe)
          {
            
          $regex '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';

            if (
          is_array($eingabe)) {
              
          $eingabe '<div style="margin-left: 10px">'.$eingabe[1].'</div>';
            }

            return 
          preg_replace_callback($regex'parseTagsRecursive'$eingabe);
          }

          $ausgabe parseTagsRecursive($eingabe);

          echo 
          $ausgabe;
          ?>
          Ich habe den Anschein das meine regex nicht korrekt ist. Und es sind span in span Tags.

          Vielleicht habe ich mich auch falsch ausgedrückt. Ich benötige eine regex die mir jedes span mit der $eingabe ersetzt.

          Kommentar


          • #6
            Ich benötige eine regex
            Da wäre ich mir nicht so sicher.

            Versuchs doch mal mit:
            PHP: DOMDocument::loadHTML - Manual
            Wir werden alle sterben

            Kommentar


            • #7
              Hallo, danke für die Info.

              Die Daten die ich wollte habe ich jetzt. Und zwar habe ich das so gemacht.

              PHP-Code:
              <?php
              $html 
              = <<<HTML
              <span id="74506" class="black">Lorem ipsum <span id='3493984'>blub</span>
               sit amet, <span id="74507" class="red">consectetuer</span> 
              <span id="1234" class="blue">test</span> elit</span>. 
              <span id="74535" class="black">Aenean</span>
               <span id="74536" class="red">commodo</span>  ligula eget dolor. Aenean
               massa. Cum sociis natoque penatibus et magnis  dis parturient montes,
               nascetur ridiculus mus. Donec quam felis,  ultricies nec, pellentesque eu,
               pretium quis, sem. Nulla consequat massa  quis enim. Donec pede justo,
               fringilla vel, aliquet nec, vulputate  eget, arcu. In enim justo, rhoncus ut,
               imperdiet a, venenatis vitae,  justo. Nullam dictum felis eu pede mollis 
              pretium. Integer tincidunt.  Cras dapibus. Vivamus elementum semper nisi.
               Aenean vulputate eleifend  tellus. Aenean leo ligula, porttitor eu, consequat 
              vitae, eleifend ac,  enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat
               a, tellus.  Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. 
              Aenean  imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper  
              ultricies nisi. Nam eget dui. Etiam rhoncus. 
              <span id="74508" class="yellow">Maecenas
               <span id="74509" class="black">tempus</span>,
              tellus  eget</span> condimentum rhoncus, sem quam semper libero,
               sit amet <br /><br />
              HTML;

              $dom = new DOMDocument();
              $dom->loadHTML($html);

              $xpath = new DOMXPath($dom);

              $tags $xpath->query('/html/body/span[@id]/span[@id]|/html/body/span[@id]');
              foreach (
              $tags as $tag) {
                echo 
              $tag->nodeValue "<br/>";
              }
              ?>
              Jetzt stehe ich ein wenig auf dem Schlauch. Wie bekomme ich bei der Ausgabe auch noch die id aus $tag mit rein?

              Gruß Yvon

              Kommentar


              • #8
                ich glaub da musst du mittels
                Code:
                if ($tag->[URL="http://www.php.net/manual/de/domnode.hasattributes.php"]hasAttributes[/URL]()==TRUE)[FONT=verdana] {
                    [/FONT]$attrs = $tag->attributes;
                   foreach ($attrs as $attrName => $attrNode)
                        .... 
                [FONT=verdana][/FONT]
                vorgehen
                [font=Verdana]
                Wer LESEN kann, ist klar im Vorteil!
                [/font]

                Kommentar


                • #9


                  Ich hab es gerade in den Moment in dem Du gepostet hast selbst hinbekommen:

                  PHP-Code:
                  $tag->getAttribute('id');
                  $tag->getAttribute('class'); 
                  Vielen Dank für Eure Hilfe!

                  Kommentar

                  Lädt...
                  X