Ankündigung

Einklappen
Keine Ankündigung bisher.

preg_replace / regex negieren

Einklappen

Neue Werbung 2019

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

  • preg_replace / regex negieren

    Hallo zusammen,

    ich möchte mittels preg_replace ein bestimmtes HTML-Tag ändern.
    Aber nur, wenn keine Zahl darauf folgt.

    Original:
    <h1>Controlling</h1>

    Ersetzen:
    <h1>1. Controlling</h1>

    Wenn ich ein zweites mal danach suche, soll es nicht mehr ersetzt werden.
    Also wenn eine Zahl nach dem TAG folgt, soll nichts passieren.

    Umsetzen wollte ich das mittels:

    PHP-Code:
    $inhalt preg_replace("/<h1>[^1-9]/""<h1>".$index.". "$dateiinhalt); 
    Aber leider bekomme ich als Ergebnis beim ersten Durchlauf nur fogendes:

    <h1>1. ontrolling</h1>

    Wo fehlt hier das Gewürz zur Vollendung?
    Danke schonmal....

    Gruß
    Thomas

  • #2
    Don't preg(), just DOMDocument XPATH's and modify.

    Ich tipp ma schwer drauf du gräbst dich per preg_* durchs ganze dokument, gell?

    Kommentar


    • #3
      Ja, eher gesagt durch mehrere Dokumente.
      Aber wie wäre denn hier die Lösung?

      Kommentar


      • #4
        PHP-Code:
        <?php

        $demo 
        = <<<'HTML'
        <!DOCTYPE html>
        <html>
            <head><title>test</title></head>
            <body>
                <div class="a">
                    <h1>1. bla</h1>
                    <p>blub bla</p>
                </div>
                <div class="a">
                    <h1>bla</h1>
                    <p>blub bla</p>
                </div>
            </body>
        </html>
        HTML;

        $o simplexml_load_string($demo);

        $entries $o->xpath("//body/div[@class='a']");

        foreach ( 
        $entries as &$entry ) {
            
            if ( 
        is_numeric(substr($entry->h1,0,1)) ) $entry->h1 'edited';
        }

        echo 
        $o->asXML();
        Als beispiel per SimpleXML, DOMDocument ist das selbe in grün.

        Kommentar


        • #5
          Nur zur Vollständigkeit und um den Fehler oben noch einmal zu verdeutlichen, der 1. Buchstabe traf ja auf das gewünschte nicht Zahl zu und wurde daher mitersetzt.
          Daher das [^1-9] Klammern und einfach bei der Ersetzung wieder reinpacken, dann passt alles.

          Kommentar


          • #6
            Ja, daran arbeite ich bereits.
            Laut http://www.regexplanet.com/simple/index.html funktioniert das so:


            Original Expression: (<h1>)([^1-9])
            Replacement: $11. $2

            Aber per preg_replace funzt das nicht.

            PHP-Code:
            $inhalt preg_replace("/(<h1>)([^1-9])/""$1".$index.". $2"$dateiinhalt); 
            Ergebnis:
            . Controlling</h1>

            k.A. warum...

            Kommentar


            • #7
              ok, hier die Lösung:

              PHP-Code:
              $inhalt preg_replace("/<h1>([^1-9])/""<h1>".$index.". $1"$dateiinhalt); 
              Danke!

              Gruß
              Thomas

              Kommentar


              • #8
                Aber an deiner Stelle würde ich die Lösung von tr0y verwenden, die ist eindeutig besser, mein Beitrag war nur zur Vervollständigung gedacht, da es immer doof ist, wenn man die Lösung zum eigentlichen Problem am Ende immer noch nicht weiß.

                Kommentar


                • #9
                  Zitat von tr0y Beitrag anzeigen
                  Als beispiel per SimpleXML, DOMDocument ist das selbe in grün.
                  Nicht ganz. Wenn ich im obigen Beispiel z.B. <p>blub bla aber blöd</p> habe,
                  wird mir das XML nicht geladen. DOMDocument hat die Probleme nicht ?
                  Hab damit noch nicht gearbeitet, deshalb dies als Frage.

                  Kommentar


                  • #10
                    Zitat von jspit Beitrag anzeigen
                    Nicht ganz. Wenn ich im obigen Beispiel z.B. <p>blub bla aber blöd</p> habe,
                    wird mir das XML nicht geladen. DOMDocument hat die Probleme nicht ?
                    Hab damit noch nicht gearbeitet, deshalb dies als Frage.
                    Lädt SimpleXML unter PHP 5.3.10 ( 64-Bit ) ohne weiteres, auch mit äüö oder sonstwas. Allerdings "speichert" SimpleXML Sonderzeichen htmlspecialchars()'ed.

                    Kommentar


                    • #11
                      Hast Recht, bei mir auch. War ein Eigentor (falsche Kodierung benutzt)

                      Kommentar

                      Lädt...
                      X