Ankündigung

Einklappen
Keine Ankündigung bisher.

[RegEx] Whitespace entfernen

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [RegEx] Whitespace entfernen

    Hallo zusammen,

    ich habe einen String
    PHP-Code:
    $text '
    <html>
      <head>                 </head>
      <!--
        entfernen
      -->
      <!--[if IE]>
        nicht entfernen
      <![endif]-->
      <body>
        Das ist nur ein Test<br />
        <br />
        <pre>Der Whitespace

        hier

        darf nicht entfernt werden.
        </pre>
        <pre class="test">    Test </pre>
      </body>
    </html>
    '

    aus dem ich sämtlichen Whitespace, also Umbrüche und alle Leerzeichen zwischen > und <, entfernen möchte; wichtig dabei ist jedoch, dass alles zwischen <pre>-Tags unberücksichtigt bleibt.

    Meine bisherigen Ansätze mittels preg_replace waren wenig erfolg-versprechend: ich weiß zwar, wie ich mittels RegEx die <pre>-Tags identifiziere. Jedoch hilft mir das nicht weiter, da ich es nicht hinbekomme, diese Tags unberücksichtigt zu lassen.
    PHP-Code:
    $text2 preg_replace(
      array(
        
    '#(<pre.*>.*</pre>)#Us'
      
    ),
      array(
        
    '$1'
      
    ),
      
    $text
    ); 
    Oben genanntes identifiziert die <pre>s richtig, nun muss ich da nur noch den Whitespace rausbekommen.

    Nach einiger Recherche bekomme ich zwar einige Ansätze, jedoch bleiben bei den Beispielen jedes Mal die <pre>-Tags berücksichtigt.

    Vielleicht hat schon mal jemand etwas ähnliches gemacht oder hat eine Idee dazu.

    Vielen Dank und beste Grüße,
    Lars

  • #2
    Soweit mir dazu eine Lösung einfällt bist du mit PHP schlecht bedient. Meine Idee wäre es, zu prüfen ob <pre> ... </pre> NICHT vorhanden ist und in diesem Fall die whitespaces (\s) zu ersetzen. Das dürfte allerdings nur mit einem negativen look-ahead funktionieren was nur in pearl unterstützt wird (soweit ich weiß).

    Eine andere Möglichkeit rein mit RegExp will mir nicht einfallen.

    Du kannst natürlich alternativ einen Lösungsweg ohne RegExp oder zumindest nicht ausschließlich mit RegExp wählen.

    Auf die Schnelle würde ich einfach vorschlagen den String Zeichenweise zu durchsuchen und die Whitespaces zu ersetzen. Immer wenn du an einem <pre> vorbeikommst gehst du solange weiter (ohne ersetzen) bis du ein </pre> findest.
    [IMG]http://media.ubuntuusers.de/portal/files/ubuntu.png[/IMG][IMG]http://sqlmanager.net/i/ico/mysql.gif[/IMG][SIGPIC][/SIGPIC]

    Kommentar


    • #3
      Lookarounds sind doch auch in PHP möglich, oder irre ich da?

      Kommentar


      • #4
        Stimmt, habe gerade noch einmal nachgeschaut. Negative lookarounds funktionieren mit ?!. Hatte das wohl falsch in Erinnerung.
        Na dann sollte dem negativem Look-Ahead ja nichts mehr im Wege stehen.
        [IMG]http://media.ubuntuusers.de/portal/files/ubuntu.png[/IMG][IMG]http://sqlmanager.net/i/ico/mysql.gif[/IMG][SIGPIC][/SIGPIC]

        Kommentar


        • #5
          Ich probier's mal und melde mich dann später.

          Kommentar


          • #6
            Ja, sind möglich: Der RegExp-Evaluator - RegExp-Tutorial - Assertions .
            [URL]http://hallophp.de[/URL]

            Kommentar


            • #7
              Hm, weder
              PHP-Code:
              '#(?<!\<pre)[\r\n|\r|\n](?!\<\/pre>)#' 
              noch
              PHP-Code:
              '#(?<!\<pre)[\r\n|\r|\n](?!\<\/pre>)#s' 
              tun's. Bin ich irgendwie auf dem Holzweg?

              Beide Muster entfernen alle (also auch innerhalb der <pre>-Tags) Umbrüche.

              Kommentar


              • #8
                Nach
                Code:
                (?<!\<pre)
                und vor
                Code:
                [\r\n|\r|\n]
                können auch noch andere Zeichen stehen, die du bislang nicht beachtest.
                [URL]http://hallophp.de[/URL]

                Kommentar


                • #9
                  Könntest du mir vielleicht einen Ansatz geben? Aus Logischer Sicht heißt der Ausdruck doch nun "Ersetze alle Umbrüche, aber nicht wenn der Umbruch nach <pre oder vor </pre steht". Oder nicht?

                  Kommentar


                  • #10
                    Dann müsste er aber direkt danach oder unmittelbar vor den Tags stehen.
                    [URL]http://hallophp.de[/URL]

                    Kommentar


                    • #11
                      Ah, okay. Glaube ich weiß was du meinst. Allerdings gibt mir das Muster
                      PHP-Code:
                      '#(?<!\<pre.*>).*[\r\n|\r|\n](?!\<\/pre>)#' 
                      folgenden Fehler:
                      Warning: preg_replace() [function.preg-replace]: Compilation failed: lookbehind assertion is not fixed length at offset 12

                      Kommentar


                      • #12
                        Natürlich, das liegt am .* - solche Assertions müssen eine feste Länge haben, variable Länge geht an der Stelle nicht.
                        [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

                        Kommentar


                        • #13
                          In einer lookbehind assertion kannst du keine Quantifizierer wie + oder * verwenden. Bei lookahead assertions ist das dagegen möglich.

                          Ich kann dir leider nur mit ein paar Worten helfen. Zum ausführlichen Testen fehlt mir hier die Umgebung und der IE 6 treibt mich jetzt schon in den Wahnsinn.

                          Gruß
                          [URL]http://hallophp.de[/URL]

                          Kommentar


                          • #14
                            Zitat von ChrisB Beitrag anzeigen
                            Natürlich, das liegt am .* - solche Assertions müssen eine feste Länge haben, variable Länge geht an der Stelle nicht.
                            Das ist natürlich doof. Ich dachte, eine Umänderung in
                            PHP-Code:
                            $text2 preg_replace(
                              array(
                                
                            //'#<!--[^[]*-->#s', // HTML-Kommentare außer Conditional Comments, Multiline
                                
                            '#(?<!\<pre)(.*)[\r\n|\r|\n](?!\<\/pre>)#'
                                
                            //'#[ ]+#'
                              
                            ),
                              array(
                                
                            //'',
                                
                            '$1'
                                
                            //' '
                              
                            ),
                              
                            $text
                            ); 
                            würde helfen, tut sie allerdings nicht. Es werden wieder alle Umbrüche entfernt

                            Kommentar


                            • #15
                              Also ich komm da nicht weiter. Vielleicht kannst du das ja mal später genauer testen, wenn du in einer besseren Arbeitsumgebung bist

                              Danke schonmal bis hierhin.

                              Kommentar

                              Lädt...
                              X