Reto: Content: finde das "zweite" öffende <p> und scheibe etwas davor. [Meine Idee nur Bastlerlösung]

Hallo,

vielen Dank noch einmal für die hilfe bei meiner ersten Frage (Inhaltsverzeichnis anhand von Überschriften erstellen). Hier direkt die zweite hinterher, ich suche (mit PHP) im $content das "zweite" vorkommen von <p> und mein Inhaltsverzeichnis dort an zu hängen.

Mein erster Gedanke war:

  1. Finde das erste Vorkommen mit http://php.net/manual/de/function.strpos.php
  2. Ersetze das erste <p> durch einen Platzhalter <platzhalter_p>
  3. Finde das erste Vorkommen (strpos)
  4. Füge vor dem <p> das Inhaltsverzeichnis ein
  5. Ersetzte den Platzhalter <platzhalter_p> durch das ursprüngliche <p>

Das fühlt sich an wie die "absolute" Bastlerlösung. [...]Von hinten durch die Brust ins Auge [...]

Sicher habt Ihr bessere Ideen das an zu gehen.

  1. Hi,

    Mein erster Gedanke war:

    1. Finde das erste Vorkommen mit http://php.net/manual/de/function.strpos.php
    2. Ersetze das erste <p> durch einen Platzhalter <platzhalter_p>
    3. Finde das erste Vorkommen (strpos)

    Nee - nutze den dritten Parameter von strpos für die zweite Suche.

    cu,
    Andreas a/k/a MudGuard

    1. Hallo Andreas,

      vielen Dank. Da habe ich die Dokum. wohl nicht aufmerksam genug gelesen. Felix ansatz ist noch einen Schritt smarter.

      Reto

      1. @@Reto

        Felix ansatz ist noch einen Schritt smarter.

        Ich würde nichts, was Markup mittels regulären Ausdrücken parst, als smart bezeichnen.

        LLAP 🖖

        --
        „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
        1. Hello lieber Gunnar,

          Felix ansatz ist noch einen Schritt smarter.

          Ich würde nichts, was Markup mittels regulären Ausdrücken parst, als smart bezeichnen.

          Ich stimme Dir aus weiter unten genannten Gründen prinzipiell zu. Kommt aber immer auf den erlaubten Aufwand und die geforderte Stabilität an. Für schnelle schmutzige Lösungen, die eine Sichtkontrolle vorher- oder nachgehen lassen, ist es mMn durchaus zulässig.

          #@Gunnar Bittersmann (persönliche Anmerkung): Da Du öfter derartig kurze Anti-Kommentare ablässt, ohne eine zumindest kurze Erklärung beizufügen, bitte ich Dich hiermit öffentlich, das in Zukunft zu tun, oder aber die Kommentare (die wie Bashing ausehen) zu unterlassen ;-)

          Liebe Grüße
          Tom S.

          --
          Es gibt nichts Gutes, außer man tut es!
          Das Leben selbst ist der Sinn.
          1. @@TS

            Da Du öfter derartig kurze Anti-Kommentare ablässt, ohne eine zumindest kurze Erklärung beizufügen, bitte ich Dich hiermit öffentlich, das in Zukunft zu tun, oder aber die Kommentare (die wie Bashing ausehen) zu unterlassen ;-)

            Die kurze Erklärung hattest du bereits geliefert. Ich hab besseres zu tun als bereits Gesagtes zu wiederholen. Von daher kann ich deiner Bitte nicht entsprechen.

            LLAP 🖖

            --
            „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
            1. Hallo Gunnar,

              Die kurze Erklärung hattest du bereits geliefert. Ich hab besseres zu tun als bereits Gesagtes zu wiederholen.

              Dein Kommentar selber ist auch nur eine Wiederholung von bereits eine Millionen mal gesagtem. Du verhältst dich inkonsistent.

              LG,
              CK

              1. Hallo Christian,

                Die kurze Erklärung hattest du bereits geliefert. Ich hab besseres zu tun als bereits Gesagtes zu wiederholen.

                Dein Kommentar selber ist auch nur eine Wiederholung von bereits eine Millionen mal gesagtem. Du verhältst dich inkonsistent.

                Hm. Da fehlt ein Smiley. Sorry. Das sollte eigentlich so sein:

                Dein Kommentar selber ist auch nur eine Wiederholung von bereits eine Millionen mal gesagtem. Du verhältst dich inkonsistent. 😝

                LG,
                CK

                1. Hm. Da fehlt ein Smiley.

                  Ich fands ohne Smiley treffender 😉

                  1. Hallo,

                    Hm. Da fehlt ein Smiley.

                    Ich fands ohne Smiley treffender 😉

                    Kommt auf den Smily drauf an 😤😫😲🤐

                    Gruß
                    Kalk

        2. hallo

          Ich würde nichts, was Markup mittels regulären Ausdrücken parst, als smart bezeichnen.

          Ein DOM-Parser machts auch nicht besser.

          Die Katastrophe ist vorprogrammiert, weil Templates vermieden werden und auf solch dubiose Kriterien wie das n-te Element gebaut wird.

          --
          Neu im Forum! Signaturen kann man ausblenden!
          1. Hello,

            Ich würde nichts, was Markup mittels regulären Ausdrücken parst, als smart bezeichnen.

            Ein DOM-Parser machts auch nicht besser.

            Die Katastrophe ist vorprogrammiert, weil Templates vermieden werden und auf solch dubiose Kriterien wie das n-te Element gebaut wird.

            Beachte aber bitte auch, dass wir uns noch ganz am Anfang der Diskussion zu diesem Thema mit Reto befinden und nicht sofort alle Aspekte berücksichtigen können. Das kann man im übrgen eigentlich nie!

            Mit den DOM-Klassen kann man durchaus eine so hohe Spezifität erreichen, dass sogar Browser in der Lage sein sollen, ihre CSS-Anweisungen auf das richtige Element anzuwenden :-P

            Ich habe nicht umsonst auch auf die XPath-Methoden der DOM-Klassen verwiesen.

            Dazu gehören dann z. B. auch Methoden, wie

            usw...

            Einige Sachen in der Klassensammlung humpeln zwar noch ein wenig. Aber seitdem sie fest zu PHP gehört (Voraussetzung passende Kompilation), sind die Methoden weitestgehend mit den Methoden der JavaScript-Blibliotheken harmonisiert, sodass man die Namen und Funktionsweisen der meisten Methoden nur einmal lernen muss.

            Man weiß also schonmal, wonach man in den Dokus (kreuzweise) suchen muss.

            Liebe Grüße
            Tom S.

            --
            Es gibt nichts Gutes, außer man tut es!
            Das Leben selbst ist der Sinn.
  2. Liebe(r) Reto,

    1. Finde das erste Vorkommen mit http://php.net/manual/de/function.strpos.php
    2. Ersetze das erste <p> durch einen Platzhalter <platzhalter_p>
    3. Finde das erste Vorkommen (strpos)

    mit einem passenden Suchmuster ginge das mit einem einzigen preg_replace():

    $insert = '<a>Link</a>';
    
    $html = preg_replace(
        '~(.*?<p>.*?)(<p)~',
        '$1'.$insert.'$2',
        '<div><p>Trallala</p><p>Fidirallalla</p></div>'
    );
    
    // $html = <div><p>Trallala</p><a>Link</a><p>Fidirallalla</p></div>
    

    In den runden Klammern notierte Muster "merkt" sich preg_replace(), wobei jedes Klammernpaar durchnummeriert wird, beginnend mit 1. Daher kann man mit der Zeichenfolge $1 oder auch \1 auf den gefundenen Inhalt Bezug nehmen, der zum Muster in der ersten Klammer passt. Analog geht das auch mit dem Inhalt zum zweiten Muster mit $2 bzw. \2.

    Liebe Grüße,

    Felix Riesterer.

    1. Hallo Felix,

      vielen Dank für die Hilfe. In deinem Beispiel funktioniert es, ich habe das ganze ein wenig angepasst ($content eingeführt), und nun passiert nichts (kein <p> wird mit dem Link erweitert)

      `<?php
      $insert = '<a href="#">Link</a>';
      $content = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, <p>sed diam voluptua</p>. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.   
      
      Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.   
      
      Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.   
      
      Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.   
      
      Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.   
      
      At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.   
      
      Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos <p>et accusam et </p>justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus.   
      
      Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.   
      
      Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.   
      
      Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.   
      
      Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.   
      
      Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.   
      
      At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.   
      
      Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus.   
      ';
      
      $html = preg_replace(
          '~(.*?<p>.*?)(<p)~',
          '$1'.$insert.'$2', $content
      );
      
      echo $html;
      

      Der Syntax sollte jetzt doch eigentlich korrekt sein?

      1. Hello,

        vielen Dank für die Hilfe. In deinem Beispiel funktioniert es, ich habe das ganze ein wenig angepasst ($content eingeführt), und nun passiert nichts (kein <p> wird mit dem Link erweitert)

        Das liegt am nicht zuende gedachten Suchmuster.
        Zeilenumbrüche an (fast) beliebiger Stelle wurden nicht berücksichtigt. Und wenn dann jemand sowas schreibt:

           <p 
              class="vorspann">
                 Hier kommt ein beliebiger
                 Text mit Zeilenumbrüchen  
                 und sonstigem Blödsinn </p 
           >
        

        Oder wenn schließende </p>-Tags fehlen, warum auch immer...

        Dann wird es ganz verrückt.

        Darum bist Du mit den DOM-Klassen auf jeden Fall besser aufgestellt. Da Du sie doch ohnehin schon für das Parsen des Dokumentes für das Inhaltsverzeichnis benutzt, kannst Du sie doch auch gleich noch für die Veränderung des Dokumentes benutzen. Da Das DOM im Speicher ohnehin schon aufgebaut ist, ist das wenig Mehraufwand für den Prozess.

        Liebe Grüße
        Tom S.

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
        1. Hallo Tom,

          vielen Dank für die Antwort. Ich mache es nicht mit der DOM Klasse sondern mit preg_match_all: preg_match_all('/<[hH][1-6]>(.*)<\/[hH][1-6]>/',$content, $datensatz_inhaltsverzeichnis, PREG_PATTERN_ORDER); Das war schneller und weniger umständlich als die DOM Variante.

          1. Hello,

            vielen Dank für die Antwort.

            Ich mache es nicht mit der DOM Klasse sondern mit preg_match_all:

            preg_match_all('/<[hH][1-6]>(.*)<\/[hH][1-6]>/',$content, $datensatz_inhaltsverzeichnis, PREG_PATTERN_ORDER);

            Das war schneller und weniger umständlich als die DOM Variante.

            Schade, denn das rächt sich nun und in allen folgenen Operationen zum Thema!

            Für derartige Aufgaben lohnt es sich wirklich, sich mit den DOM-Klassen von PHP zu beschäftigen. :-)

            Schau dir wenigstens mal den Lösungsansatz von Regina Schaukrug an. Der zeigt, wie einfach der Einstieg sein kann. Der Vorschlag ist zwar auch noch nicht ganz durchgängig mit DOM-Methoden aufgebaut, aber das lässt sich noch nacharbeiten. (So langsam wird mein Arbeitsplatz auch wieder arbeitsfähig).

            Liebe Grüße
            Tom S.

            --
            Es gibt nichts Gutes, außer man tut es!
            Das Leben selbst ist der Sinn.
          2. Lieber Reto,

            Ich mache es nicht mit der DOM Klasse sondern mit preg_match_all:

            für einfache Operationen mag das ausreichen. Aber spätestens, wenn Du komplexere Strukturen komplexer nachbearbeiten willst, kommst Du um ein vernünftiges Parsen mit Objektstruktur, welches am Ende korrekt serialisiert wird, nicht herum. Und weil das eine wichtige Erkenntnis ist, haben sich Leute mit großen Ansprüchen daran gemacht, einen sehr guten HTML5-Parser für PHP zu bauen.

            Liebe Grüße,

            Felix Riesterer.

            1. Hello lieber Felix,

              Und weil das eine wichtige Erkenntnis ist, haben sich Leute mit großen Ansprüchen daran gemacht, einen sehr guten HTML5-Parser für PHP zu bauen.

              Könntest Du eventuell beschreiben, was den von den eingebauten DOM-Klassen in PHP unterscheidet? Bitte positiv, wie negativ, wenn Du das schon ergründet hast.

              Das interessiert mich sehr, da ich mich vor meinem kleinen Unfall im letzten Jahr intensiver mit den DOM-Klassen beschäftigt hatte und für einige Leute damit Webseiten-Analysen (Shops beobachten) aufgebaut hatte. Alternativen sind da immer wichtig. Meine Erinnerung kommt nach und nach mit der Durcharbeit aller Aufzeichnungen wieder.

              Liebe Grüße
              Tom S.

              --
              Es gibt nichts Gutes, außer man tut es!
              Das Leben selbst ist der Sinn.
              1. Lieber TS,

                HTML5-Parser für PHP

                Könntest Du eventuell beschreiben, was den von den eingebauten DOM-Klassen in PHP unterscheidet?

                dieser Parser setzt auf den DOM-Objekten von PHP auf. Er ist im Grunde nur eine Erweiterung in dem Sinne, als dass Du das Parsen und Serialisieren von ihm, anstelle der dafür ebenfalls erhältlichen PHP-DOM-Methoden erledigen lässt. Ansonsten hantierst Du mit den üblichen DOM-Objekten wie gewohnt.

                Liebe Grüße,

                Felix Riesterer.

                1. Hello,

                  HTML5-Parser für PHP

                  Könntest Du eventuell beschreiben, was den von den eingebauten DOM-Klassen in PHP unterscheidet?

                  dieser Parser setzt auf den DOM-Objekten von PHP auf. Er ist im Grunde nur eine Erweiterung in dem Sinne, als dass Du das Parsen und Serialisieren von ihm, anstelle der dafür ebenfalls erhältlichen PHP-DOM-Methoden erledigen lässt. Ansonsten hantierst Du mit den üblichen DOM-Objekten wie gewohnt.

                  Danke für die Info.
                  Wenn ich den jetzt also durcharbeite, bekomme ich sinnvolle Arbeitshilfen für die DOM-Klassen von PHP? Oder wird da das Rad neu erfunden und nur in Wrapper gepackt?

                  Kommt auf jeden Fall (wieder) auf meinen Zettel!

                  Liebe Grüße
                  Tom S.

                  --
                  Es gibt nichts Gutes, außer man tut es!
                  Das Leben selbst ist der Sinn.
                  1. Lieber TS,

                    Wenn ich den jetzt also durcharbeite, bekomme ich sinnvolle Arbeitshilfen für die DOM-Klassen von PHP? Oder wird da das Rad neu erfunden und nur in Wrapper gepackt?

                    $html5 = new \Masterminds\HTML5;
                    
                    $document = $html5->loadHTML('<!DOCTYPE html><html><head>...</html>');
                    
                    foreach ($document->getElementsByTagName('p') as $p) {
                        $p->setAttribute('class', 'found'); // Unsinn, ich weiß...
                    }
                    

                    Liebe Grüße,

                    Felix Riesterer.

        2. Lieber TS,

          Das liegt am nicht zuende gedachten Suchmuster.
          Zeilenumbrüche an (fast) beliebiger Stelle wurden nicht berücksichtigt.

          da hattest Du Recht.

          Oder wenn schließende </p>-Tags fehlen, warum auch immer...

          Dann wird es ganz verrückt.

          Nö. Wenn Attribute möglich sein sollen, dann machst Du einfach die schließende spitze Klammer wieder weg.

          Liebe Grüße,

          Felix Riesterer.

          1. Hello,

            Das liegt am nicht zuende gedachten Suchmuster.
            Zeilenumbrüche an (fast) beliebiger Stelle wurden nicht berücksichtigt.

            da hattest Du Recht.

            War auch keinesfalls böse gemeint, da Du ja nur eine Anregung gegeben hast, die Reto dann leider aus eigener Noch-Unkenntnis nahezu 1:1 übernommen hat. MMn setzen Regular Expressions selbst für Profis noch "absolutes Wissen into the Depth" voraus.

            Die DOM-Klassen in PHP erfordern zwar auch etliche Übungen, aber sie liefern bestenfalls ein "FALSE" (im übertragenen Sinne), wenn man sie falsch anwendet.

            Oder wenn schließende </p>-Tags fehlen, warum auch immer...

            Dann wird es ganz verrückt.

            Nö. Wenn Attribute möglich sein sollen, dann machst Du einfach die schließende spitze Klammer wieder weg.

            Das verringert aber fahrlässig die Stabilität der Funktion/Mehtode.

            Liebe Grüße
            Tom S.

            --
            Es gibt nichts Gutes, außer man tut es!
            Das Leben selbst ist der Sinn.
      2. Lieber Reto,

        und nun passiert nichts (kein <p> wird mit dem Link erweitert)

        wenn Zeilenumbrüche enthalten sind, muss das Suchmuster noch ein (?s) enthalten:

        $insert = '<a>Link</a>';
        
        $html = preg_replace(
            '~(?s)(.*?<p>.*?)(<p)~',
            '$1'.$insert.'$2',
            "<div>\r\n\t<p>Trallala</p>\r\n\t<p>Fidirallalla</p>\r\n</div>"
        );
        
        /* $html = <div>
        	<p>Trallala</p>
        	<a>Link</a><p>Fidirallalla</p>
        </div>
        */
        

        Liebe Grüße,

        Felix Riesterer.

  3. Hello,

    Du hast doch gerade schon ein wenig mit den DOM-Klassen von PHP gearbeitet, denke ich?
    Dann bleib dabei und beschäftige dich noch ein wenig damit. Damit kannst Du die Aufgabe wesentlich sauberer lösen, als mit Regular Expressions.

    Wiederaufsetzen mit deiner Leserunde könntest Du bei getElementsByTagName

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
  4. hallo

    vielen Dank noch einmal für die hilfe bei meiner ersten Frage (Inhaltsverzeichnis anhand von Überschriften erstellen). Hier direkt die zweite hinterher, ich suche (mit PHP) im $content das "zweite" vorkommen von <p> und mein Inhaltsverzeichnis dort an zu hängen.

    Mein erster Gedanke war:

    1. Finde das erste Vorkommen mit http://php.net/manual/de/function.strpos.php
    2. Ersetze das erste <p> durch einen Platzhalter <platzhalter_p>
    3. Finde das erste Vorkommen (strpos)
    4. Füge vor dem <p> das Inhaltsverzeichnis ein
    5. Ersetzte den Platzhalter <platzhalter_p> durch das ursprüngliche <p>

    Das fühlt sich an wie die "absolute" Bastlerlösung. [...]Von hinten durch die Brust ins Auge [...]

    Sicher habt Ihr bessere Ideen das an zu gehen.

    Ausgenommen, dies ein einmaliger Vorgang, solltest du dir überlegen

    • Mit templates zu arbeiten
    • Eindeutige Ersetzungs-IDs zu verwenden

    Ein automatisierter Ersetzungsvorgang, der stur das n-te Element ersetzt, ruft nach Katastrophe!.

    --
    Neu im Forum! Signaturen kann man ausblenden!