Schorsch: Reguläre Ausdrücke Kapitel finden

Guten Tag

Ich habe Text, der schaut so aus:

text text I: text I.1) text text text SECTION II: text II.1) text text II.2) text text II.3) text holla text II.3.1) text II.4) text text II.5) text II.6) text IV: text IV.1) text text IV.2) text text V.1.2) text text  V.1.1) text VI.1) text VI.7) text VI.9) text

Und ich muss jetzt einzelne Kapitel auslesen. Zum Beispiel:
  Zeige mir nur "Kapitel II.3)"

Und müsste als Ouptput haben:
  II.3) text holla text

Was bisher geschah

Den Start habe ich:
  $start = strpos($my_text,'II.3)');

Mit Hilfe von Regulären Ausdrücken versuche ich das Ende zu finden:
  /(.*)((II|III|IV|V|VI|VII|VIII|IX|X)(.[0-9])*) | (SECTION) /i

Ich versuchte zu sagen:
  (.*)       irgendwas
  (II|...|X) gefolgt von irgend einer römischen Zahl
  (.[0-9])* beliebig mal gefolgt von Punkt Zahl
  )         gefolgt von einer schliessenden Klammer
  | SECTION  oder gefolgt von SECTION

Was muss ich noch verbessern?

Gruss
Schorsch

  1. Lieber Schorsch,

    /(.*)((II|III|IV|V|VI|VII|VIII|IX|X)(.[0-9])*) | (SECTION) /i

    Ich versuchte zu sagen:
      (.*)       irgendwas
      (II|...|X) gefolgt von irgend einer römischen Zahl
      (.[0-9])* beliebig mal gefolgt von Punkt Zahl
      )         gefolgt von einer schliessenden Klammer
      | SECTION  oder gefolgt von SECTION

    Wenn "irgendwas" (.*) ohne ein Leerzeichen dazwischen von (II|III ...) gefolgt wird, wie soll dann Dein Suchmuster im Falle von "<absatz>III. Kapitel" zwischen "II" und "III" richtig unterscheiden? Es könnte ja "<absatz>I" + "II. Kapitel" finden und glücklich sein!

    Ich würde vor der römischen Zahl auf entsprechende Zeichen prüfen, durch die absolut klar ist, dass sie nicht zu einer Kapitelnummerierung gehören, um dann die Kapitelnummerierung entsprechend zu trennen.

    Römische Zahlen bestehen aus einem Verbund von ausgewählten großgeschriebenen Buchstaben ohne Leerzeichen... könntest Du das als regulären Ausdruck definieren?

    Beispiel: /\S[IVXLCMD]*/ gefolgt von /.\d/ ergibt /\S[IVXLCMD]*.\d/

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. Salut Felix

      Beispiel: /\S[IVXLCMD]*/ gefolgt von /.\d/ ergibt /\S[IVXLCMD]*.\d/

      Vielen Dank!

      Ich habe eine Lösung gefunden...

      // Text mit den Kapiteln drin
        $var = 'Text... I.1) Hier haben wir Text... XII.1.5) '
              .'Und hier haben wir mehr Text...';

      // Gewünschtes Kapitel
        $chapter_start = ' I.1) ';

      // Startposition
        $start = strpos($var, $chapter_start);

      // Text nach der Startposition
        $var_new = substr($var, $start + strlen($chapter_start));

      // Ziel
        preg_match("/([IVXLCMD]*.\d)|(SECTION)/i", $var_new, $ziel);

      // Jetzt hab ich Start und Ziel
        // Und kann mein Kapitel ausgeben
        $result = substr($var, $start, strpos($var, $ziel[0])-$start);

      // Output
        // I.1) Hier haben wir Text...

      Vermutlich ginge das auch einfacher. Zum Beispiel, wenn man dem preg_match sagen könnte: "Bring mir den 2. Treffer..."

      Vielleicht hat jemand noch eine viel bessere Idee?

      Gruss
      Schorsch

      1. Lieber Schorsch,

        Beispiel: /\S[IVXLCMD]*/ gefolgt von /.\d/ ergibt /\S[IVXLCMD]*.\d/

        ich hatte nach dem \d ein * vergessen, denn wenn nach dem Punkt mehr als ein e Ziffer käme, dann würde diese "vergessen"...

        Vielen Dank!

        Gerne! Meine ersten Gehversuche mit regulären Ausdrücken fanden auch hier im Forum statt, und wurden sehr massiv von Seth unterstützt, wodurch mir dieses geniale Werkzeug so richtig schmackhaft wurde.

        Vermutlich ginge das auch einfacher. Zum Beispiel, wenn man dem preg_match sagen könnte: "Bring mir den 2. Treffer..."

        Ähm... das kann preg_match(), wenn ich mich nicht irre. Lies nochmal in der php-Doku nach, da war doch sowas!

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.