Tom H.: Mit Regex zu jedem Match das übergeordnete Element finden

Hallo zusammen,

Ich versuche ein unstrukturiertes Dokument mit Hilfe von Regulären Ausrdrücken für die Weiterverarbeitung im Code zu strukturieren. Das Dokument sieht vereinfacht folgendermassen aus:

<h1>Kapitel 1</h1>
<h2>Kapitel 1.1</h2>
<h1>Kapitel 2</h1>
<div>Ein Text</div>
<h2>Kapitel 2.1</h2>
<h2>Kapitel 2.2</h2>
<div>Ein Text</div>
<h3>Kapitel 2.2.1</h3>

Nun möchte ich mit Hilfe des Regex-Suchpatterns alle Elemente finden und zu jedem Kapitel oder Text der Name des übergeordneten Kapitels auslesen. Beispiel: Wenn die Regex Kapitel 2.2 findet, dann soll am Ende dann sowas wie "Kapitel 2 > Kapitel 2.2" zurückgegeben werden.

Die Regexp um die Elemente zu finden habe ich wie folgt definiert, wobei der Name des Kapitels jeweils in der zweiten Capturing-Gruppe zu finden ist:

(<h.+>|<div>)(.*?)(<\/h.+|<\/div>)

Mir fehlt jedoch eine Idee wie ich zu jedem Match nun das übergeordnete Kapitel dazu finden und zum Beispiel in der ersten Capturing-Gruppe festhalten kann - Habt ihr eine Idee?

Vielen Dank für Eure Hilfe. Tom

  1. Tach,

    Ich versuche ein unstrukturiertes Dokument mit Hilfe von Regulären Ausrdrücken für die Weiterverarbeitung im Code zu strukturieren. Das Dokument sieht vereinfacht folgendermassen aus:

    das ist keine gute Idee, HTML ist nicht regulär und deshalb sind Regexp nicht der beste Weg es zu handhaben; verwende besser einen HTML/XML-Parser.

    mfg
    Woodfighter

  2. (<h.+>|<div>)(.*?)(<\/h.+|<\/div>)
    

    Mir fehlt jedoch eine Idee wie ich zu jedem Match nun das übergeordnete Kapitel dazu finden und zum Beispiel in der ersten Capturing-Gruppe festhalten kann

    Verwende XPath. Reguläre Ausdrücke sind für die Verarbeitung von HTML und dergleichen so geeignet wie eine Axt zum Schnitzen.

  3. Mal abgesehen davon, dass der Hinweis auf alternative Tools durchaus lohnend ist - Regex ist nicht gleich Regex. Mit welcher Programmiersprache hantierst Du?

  4. @@Tom H.

    Ich versuche ein unstrukturiertes Dokument mit Hilfe von Regulären Ausrdrücken für die Weiterverarbeitung im Code zu strukturieren. Das Dokument sieht vereinfacht folgendermassen aus:

    <h1>Kapitel 1</h1>
    <h2>Kapitel 1.1</h2>
    <h1>Kapitel 2</h1>
    <div>Ein Text</div>
    <h2>Kapitel 2.1</h2>
    <h2>Kapitel 2.2</h2>
    <div>Ein Text</div>
    <h3>Kapitel 2.2.1</h3>
    

    Wäre es eine Option, das Dokument zu verändern und richtig zu strukturieren?

    Die Verwendung von h1 für die Kapitelüberschriften ist auch fraglich. h1 sollte die Überschrift des gesamten Werkes sein und im Dokument nur einmal vorkommen.

    Also:

    <h1>Das große Ganze</h1>
    <section>
      <h2>Kapitel 1</h2>
      <section>
        <h3>Kapitel 1.1</h3>
      </section>
    </section>
    <section>
      <h2>Kapitel 2</h2>
      <div>Ein Text</div>
      <section>
        <h3>Kapitel 2.1</h3>
      </section>
      <section>
        <h3>Kapitel 2.2</h3>
        <div>Ein Text</div>
        <section>
          <h4>Kapitel 2.2.1</h4>
        </section>
      </section>
    </section>
    

    Dann hast du eine brauchbare DOM-Struktur (Nutzer assistiver Technologien wie Screenreader werden es dir danken) und dein Vorhaben ist über Eltenelemente leicht umsetzbar.

    LLAP 🖖

    --
    “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
    Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
    1. Hallo,

      Ich versuche ein unstrukturiertes Dokument [...] zu strukturieren. Wäre es eine Option, das Dokument zu verändern und richtig zu strukturieren?

      Ich glaube, das ist sein Ziel...

      Gruß
      Kalk

      1. Hallo,

        Ich versuche ein unstrukturiertes Dokument [...] zu strukturieren. Wäre es eine Option, das Dokument zu verändern und richtig zu strukturieren?

        Ich glaube, das ist sein Ziel...

        Gruß
        Kalk

        Korrekt - Ich habe keinerlei Einfluss auf die ursprüngliche HTML-Seite. Das Ganze ist natürlich sehr unschön aber halt mal die Realität...

        1. Also ich habe in meinem Leben schon viele HTML Seiten mit Reg-Echsen duchwuselt und grundsätzlich geht das schon. Dass "HTML nicht regulär" ist, spielt dabei keine Rolle, schließlich willst Du keinen endlichen Automaten aus dem HTML machen, sondern "nur" Überschriften darin finden.

          Beispielsweise liefert Dir diese RegEx

             /<h([123456]).*?>(.*?)<\/h\1>/s
          

          der Reihe nach alle Überschriften-Sequenzen, bis auf einige Sonderfälle wie eine spitze rechte Klammer innerhalb von Anführungszeichen in Attributwerten oder Trümmer wie

             <h1>Das ist <h1>eine Überschrift</h1> zum Erbrechen</h1>
          

          Ein Browser mag darin einen Rest-Sinn finden, aber die RegEx nicht :)

          Je Match hast Du zwei groups im Capture, die erste ist die Überschriftenstufe, die zweite ist der Überschriftentext.

          Den Rückbezug von einer untergeordneten Überschrift zur darüberliegenden Stufe wirst Du aber außerhalb der RegEx herstellen müssen, da sehe ich mit RegEx Mitteln keine Chance.