Ben72: RegEx-Frage

Hallo!

Eine technische Frage. Wie komme ich an F?

$records = "<r>A</r><r>B</r><r>C</r><r>D</r><r>E</r>F";
$records = preg_replace("!(?<=</r>)(.+)$!", " last Record: $1", $record);
echo $records;

ergibt

A last Record: BCDEF

gewünscht ist

ABCDE last Record: F

Die Bedingung in Zeile 2 sucht wohl nach dem ersten Vorkommen von </r>. Sie soll aber das letzte finden.

Geht da was mit regulären Ausdrücken?

  1. Eine technische Frage. Wie komme ich an F?

    $records = "<r>A</r><r>B</r><r>C</r><r>D</r><r>E</r>F";
    $records = preg_replace("!(?<=</r>)(.+)$!", " last Record: $1", $record);
    echo $records;

    ergibt

    A last Record: BCDEF

    gewünscht ist

    ABCDE last Record: F

    Die Bedingung in Zeile 2 sucht wohl nach dem ersten Vorkommen von </r>. Sie soll aber das letzte finden.

    Offenbar ist F nicht ein Record im Sinne von A - E
    Eventuell kannst du ihn mit /([^<>])+$/ matchen.

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
       <°)))o><                      ><o(((°>o
    1. Offenbar ist F nicht ein Record im Sinne von A - E
      Eventuell kannst du ihn mit /([^<>])+$/ matchen.

      mfg Beat

      Hallo,

      weiß nicht, wie Du das meinst, aber ich habe es jetzt so gemacht:

      !(<r>.+</r>)+(.+)$!

      Trotzdem hätte ich noch die Frage, ob es nicht auch mit einem Look behind geht, das letzte Vorkommen selbigens zu finden, vielleicht irgend einen Modifier, den ich nicht kenne.

      1. Offenbar ist F nicht ein Record im Sinne von A - E
        Eventuell kannst du ihn mit /([^<>])+$/ matchen.

        weiß nicht, wie Du das meinst, ...

        Du hast angegeben:
        $records = "<r>A</r><r>B</r><r>C</r><r>D</r><r>E</r>F";

        F ist nicht durch ein <r> Element eingeschlossen.
        Ich nehme eine genierende Zeichenklasse
        [^<>]+
        F darf aus allen Zeichen ausser < und > bestehen.
        Aber diese Annahme kann falsch sein, da ich deine Daten nicht kenne.

        aber ich habe es jetzt so gemacht:

        !(<r>.+</r>)+(.+)$!

        du kannst statt ( )+ die nicht speichernde Gruppierung verwenden, (?:)+

        !(?:<r>.+</r>)+(.+)$!

        Trotzdem hätte ich noch die Frage, ob es nicht auch mit einem Look behind geht, das letzte Vorkommen selbigens zu finden, vielleicht irgend einen Modifier, den ich nicht kenne.

        Bei Lookbehind Assertions hast du meist die Beschränkung, dass die Zeichenlänge statisch ist.

        !(?<=</r>)+(.+)$!

        Wird dir nicht weiterhelfen, weil in

        $records = "<r>A</r><r>B</r><r>C</r><r>D</r><r>E</r>F";

        "<r>B</r><r>C</r><r>D</r><r>E</r>F"
        bereits zutrifft.

        !(?<=</r>)+([^<>]+)$!

        wird nur "F" holen, ist aber  nicht effizienter wie

        !(?:<r>.+</r>)+(.+)$!

        mfg Beat

        --
        ><o(((°>        ><o(((°>
           <°)))o><                      ><o(((°>o