Ankündigung

Einklappen
Keine Ankündigung bisher.

Compilation failed: lookbehind assertion is not fixed length

Einklappen

Neue Werbung 2019

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

  • Compilation failed: lookbehind assertion is not fixed length

    Hallo,

    ich möchte folgendes mit einem regulären Ausdruck erreichen:
    Es gibt einen Text, der enthält Normale Zeilenumbrüche.
    In diesem Text sind Listen eingebettet (mit <ul>[/list]).
    Diese Listen werden wegen der Übersichtlichkeit auch jeweils nach den htmltags umgebrochen.
    Nun möchte ich alle Umbrüche, die zwischen Tags stehen, entfernen.
    Alle anderen sollen bestehen bleiben.

    Ansatz:
    Lookahead und Lookbehind assertions. Das Muster soll nur erkannt werden, wenn vorher ein Tag steht und nachher ein schließender Tag vom gleichen Typ.

    PHP-Code:
    <?php
    $string     
    "Das hier ist die Überschrift\n\n<ul>\n[*]1\n[*]2\n[/list]Das hier ist die 2. Überschrift\n\ndas hier ist ein text.";
    $regex         "!^(?<=<.*\>)[\\r|\\n]+(?=\</$1\>)!isU";
    $replace    "";

    echo 
    nl2br(preg_replace($regex,$replace,$string));
    ?>
    Dabei tritt der genannte Fehler auf:
    Compilation failed: lookbehind assertion is not fixed length.

    Weiß jemand Rat?
    Tutorials zum Thema Technik:
    https://pilabor.com
    https://www.fynder.de

  • #2
    Zumindest hast du schonmal das 2. < nicht escaped.
    Bin mir nicht sicher, aber kann man Assertions überhaupt gruppieren (und damit per $1 wiederverwenden)? Es ist doch lediglich eine Ja-Nein-Bedingung, oder?

    Kommentar


    • #3
      Falscher ausdruck. Sorry, hier der richtige
      :
      PHP-Code:
      <?php
      $string     
      "Das hier ist die Überschrift\n\n<ul>\n[*]1\n[*]2\n[/list]Das hier ist die 2. Überschrift\n\ndas hier ist ein text.";
      $regex "!^(?<=\<(.*)\>)[\\r|\\n]+(?=\</\$1\>)!isU";
      $replace "";
      echo 
      nl2br(preg_replace($regex,$replace,$string));
      ?>
      Das will ich ja grade wissen. Ob mein Ansatz überhaupt funktioniert. Vielleicht gehts ja auch viel einfacher. Ich arbeite noch nicht lange mit assertions. Klar dem Fehler nach zu Urteilen, ist der * in der Lookahead-assertion der übeltäter, aber ich weiß nicht, wie ich einen beliebig langen Tag sonst festlegen soll.
      Tutorials zum Thema Technik:
      https://pilabor.com
      https://www.fynder.de

      Kommentar


      • #4
        Erstmal rum Testen (Nur für dieses Beispiel):

        PHP-Code:
        <?php
        '#((?<=\<ul\>)(\\r|\\n)+|(\\r|\\n)+(?=\</ul\>))#isU'
        // oder
        '#((?<=\<(ul|li)\>)(\\r|\\n)+|(\\r|\\n)+(?=\</(ul|li)\>))#isU'
        ?>
        Normalerweise gibt es kein \\n

        Kommentar


        • #5
          Mhh. Damit kommt bei mir folgendes raus:
          Code:
          Das hier ist die Überschrift
          
          
          
          <ul>[*]1(!!!!!!)
          (!!!!!!)[*]2[/list]Das hier ist die 2. Überschrift
          
          
          
          das hier ist ein text.
          Demnach vergisst er einen Umbruch. UND: Er soll das ja nicht nur für einen Tag oder für 2 Tags machen, sondern für alle.
          *kopfkratz*
          Tutorials zum Thema Technik:
          https://pilabor.com
          https://www.fynder.de

          Kommentar


          • #6
            sondern für alle.
            Hmmmm, dann brauchst du nur alle \r oder \n entfernen.
            Wozu jetzt dieser Aufwand ?
            str_replace() anwenden und fertig

            Kommentar


            • #7
              Das zeigt mal wieder, warum man Daten unformatiert in einem Daten(bank)-System ablegen sollte..

              Kommentar


              • #8
                Naja, wenn alle \r und \n zwischen Tags entfernt werden sollen, also AUCH BODY oder HTML, dann ist diese ganze Sache mit regulären Ausdrücken völlig sinnlos.
                Dann kann er gleich alle \r oder \n rauskicken

                EDIT:

                Den Rest kann man dann mit CSS bearbeiten ...

                Kommentar


                • #9
                  Ok, dann muss ich mal zu einer kurzen Erklärung ausholen, bevor ich gelüncht werde:

                  Vorhanden ist eine alte Datenbank, die Texte enthält, welche vollgepflastert mit HTML-Tags sind. Das sind seeehr viele Texte.
                  Diese Seite soll aber möglichst bald wieder online gehen.
                  Das bedeutet, der Pflegeaufwand für die Texte wäre sehr hoch.
                  Nachher soll der Text mit einem nl2br(); angezeigt werden.

                  Bei einer Liste (<ul>) ist das aber tödlich, weil diese
                  Formatierungen die Liste etwas bescheuert aussehen lassen.

                  Um das ganze zu umgehen, dachte ich an ein preg replace.
                  In der Datenbank steht nur HTML-Code zur Textformatierung, nicht mit <html> oder <body>-Tags.
                  Tutorials zum Thema Technik:
                  https://pilabor.com
                  https://www.fynder.de

                  Kommentar

                  Lädt...
                  X