Regex-Problem

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

  • Regex-Problem

    Hallo zusammen!

    Ich verzweifel gerade an folgender Aufgabe:

    Ich habe einen String, der wie folgt oder ähnlich aussieht:

    Code:
    ---Zusatzausstattung---   (pdf)
    Klimaanlage
    
    ---Info---
    Der H-1 Cargo in neuem Desgin - ein zuverlässiger Partner für den problemlosen Transport! 
    Ausgestattet mit sinnvollen und praktischer Details (z.B. die Doppelflügelhecktür öffnet sich auf beiden Seiten um 180 Grad) 
    Auffallend niedrige Betriebskosten
    
    Und noch weitere Infos...
    Dieser String wird durch einen Benutzer eingegeben und in einer Datenbank gespeichert. Da ich ja nicht weiß, welche Zeilenumbrüche der Benutzer verwendet, muss ich die irgendwie vereinheitlichen, um vernünftig mit Regex arbeiten zu können. Das versuche ich folgendermaßen:

    Code:
    $str= str_replace('\r\n','\n',$str);
    $str= str_replace ('\r','\n',$str);
    Jetzt sollten meiner Meinung nach nur noch \n-Zeilenumbrüche drin sein, oder? Gibt es eine Möglichkeit, das nachzuprüfen?

    Nun möchte ich den String filtern. Das Ergebnis sollte ein Array sein und mir folgende Informationen liefern (schematisch dargestellt):
    Code:
    [0] => [
      [0] => "Zusatzausstattung"
      [1] => "pdf"
      [2] => "Klimaanlage"
    ]
    [1] => [
      [0] => "Info"
      [1] => ""
      [2] => "Der H-1 Cargo in neuem Desgin - ein zuverlässiger Partner für den problemlosen Transport! 
    Ausgestattet mit sinnvollen und praktischer Details (z.B. die Doppelflügelhecktür öffnet sich auf beiden Seiten um 180 Grad) 
    Auffallend niedrige Betriebskosten"
    ]
    Wichtig ist: Die einzelnen Blöcke (z.B. Info[...]Betriebskosten) sollen durch 2 oder mehr Zeilenumbrüche getrennt werden. Hat ein Block keine Überschrift (markiert durch ---[...]---) darf sie er nicht herausgefiltert werden.

    Bisher habe ich es mit folgender Regex (mit preg_match_all) versucht:
    Code:
      /---(.+)---[ ]*[\(]?([a-z]*)[\)]?[ ]*\n(.*)[\n]{2,}/S
    Das führt aber bisher leider zu keinem Ergebnis..

    Kann mir jemand helfen?

  • #2
    naja, generell können Regex schon ziemlich gut mit Zeilenumbrüchen arbeiten.

    Zur Sicherheit kannst du den Text aber mal in nen HEX-Editor kopieren. Zeilenumbrüche sollten dabei erhalten bleiben.

    Bau dir dein RegEx Pattern mal Stück für Stück auf. Dann erkennst du auch, an welcher Stelle es nicht mehr mit deinen Erwartungen übereinstimmt.

    Kommentar


    • #3
      Also meinst du muss ich nicht erst mit str_replace() die Zeilenumbrüche vereinheitlichen. Was soll ich denn in der Regex für einen Zeilenumbruch verwenden, damit ich alle möglichen Varianten (\n, \r, \r\n, gibt es noch mehr?) abdecke?

      Natürlich habe ich schon versucht, mir die Regex schrittweise aufzubauen. Ich komm da einfach nicht weiter...

      Kommentar


      • #4
        Ich komm einfach nicht weiter, ist mal wenig kreativ.

        Was ist die letzte gültige RegEx und ab wo funktioniert es nicht mehr?

        Kommentar


        • #5
          Ok, ich habs jetzt nochmal von vorne versucht...

          Bis hierhin komm ich:
          Code:
          ---(.+)---[ ]*\(?([a-z]+)?\)?\r?\n(.+\r?\n)+?
          Nun komm ich soweit, dass die erste Zeile des Blocks miterfasst wird. Mein Problem an der Stelle ist nun: Wie bekomm ich es hin, dass er alle weiteren Zeilen bis zu der Stelle, an der 2 oder mehr Zeilenumbrüche stehen erfasst? Wenn ich das letzte ? entferne, dann bekomm ich den ganzen restlichen String in einem Match (obwohl es ja - da es zwei Blöcke gibt - zwei sein sollten)..

          Kommentar


          • #6
            Der RegExp-Evaluator - RegExp-Evaluator - Ergebnis

            Kommentar


            • #7
              Cool, funktioniert... Danke!!

              Kommentar

              Lädt...
              X