ebody: Regex - Zwischen 2 Zeichen auslesen

Hallo,

ich möchte mit Regex den Teil zwischen 2 Zeichen auslesen, ohne die 2 Zeichen.

Beispiel: lorem "ipsum" dolor

ipsum soll ausgelesen werden.

Zuletzt hatte ich schon mal so einen Fall und hatte mir notiert, dass es hiermit geht: "[^"]*"

Aber die " werden immer mit erfasst.

Weitere Versuche waren:

  • (?:")([^"]*)(?:")
  • "([^"]*)"
  • "(.*)"
  • (?:")(.*)(?:")

Aber es wird immer ipsum inkl. " erfasst.

http://regexr.com/3f7qm

Gruß ebody

  1. Tach!

    Zuletzt hatte ich schon mal so einen Fall und hatte mir notiert, dass es hiermit geht: "[^"]*"

    Die Anführungszeichen gehören ja auch zum Suchmuster. Eine Gruppierung für das, was du eigentlich suchst, kann helfen. Assertions sind auch noch eine Variante, aber Gruppieren ist einfacher.

    dedlfix.

  2. Moin,

    Weitere Versuche waren:

    • "([^"]*)" Aber es wird immer ipsum inkl. " erfasst.

    http://regexr.com/3f7qm

    Also das ist aber der richtige RegExp. Schau mal genau bei dem Tester hin. er findet den kompletten String (inkl. Anführungszeichen). Wenn du auf das Wort mit der Maus fährst, zeigt er jedoch: group #1: ipsum

    Ergo das richtige Ergebnis. Evaluieren kannst du dies wenn du mal folgenden RegExp probierst: "ip(.*)m"

    Ergebnis: der gesamte String bleibt markiert (auch mit Anführungszeichen). Wenn du aber jetzt auf das Wort mit der Maus fährst, erscheint group #1: su

    Ein besserer Regexptester finde ich ist dieser hier: https://regex101.com/. Da siehst du das Ergebnisse direkt in einem Array und farblich besser hervorgehoben.

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. Stimmt was du sagst. Wenn ich die Suchmuster aber mit der PHP Funktion preg_replace() anwende, wird der komplette String inkl. "" ersetzt und nicht der String innerhalb von "".

      $str = 'lorem "ipsum" dolor';
      $str = preg_replace('/"([^"]*)"/', 'ersatz', $str);
      echo $str; // lorem ersatz dolor
      

      Gruß ebody

      1. Tach!

        Stimmt was du sagst. Wenn ich die Suchmuster aber mit der PHP Funktion preg_replace() anwende, wird der komplette String inkl. "" ersetzt und nicht der String innerhalb von "".

        Ja, weil diese Funktion sich im Suchstring nicht um Gruppen kümmert. Gruppen sind eher für preg_match() interessant. Probier mal, die nicht gewünschen Anführungszeichen in eine non-capturing group einzupacken (?:"). Die Gruppe um den Mittelteil kannst du dann wieder weglassen.

        dedlfix.

        1. Ich habe es jetzt so probiert, ist aber leider das gleiche Ergebnis.

          $str = 'lorem "ipsum" dolor';
          $str = preg_replace('/(?:")([^"]*)(?:")/', 'ersatz', $str);
          echo $str; // lorem ersatz dolor
          

          Gruß ebody

          1. Tach!

            Ich habe es jetzt so probiert, ist aber leider das gleiche Ergebnis.

            Hatte ich jetzt nicht erwartet. Aber gut, dann nehmen wir eben Assertions.

            Das geht mit diesem Pattern /(?<=")[^"]*(?=")/.

            dedlfix.

      2. Hi,

        Stimmt was du sagst. Wenn ich die Suchmuster aber mit der PHP Funktion preg_replace() anwende, wird der komplette String inkl. "" ersetzt und nicht der String innerhalb von "".

        Und was hält Dich davon ab, vorn und hinten an den Ersatz-String einfach ein " anzufügen? Also statt 'ersatz' einfach '"ersatz"' zu verwenden?

        Solange die eingrenzenden Zeichen konstant sind, dürfte das die einfachste Möglichkeit sein.

        Ansonsten die eingrenzenden Zeichen auch merken a la /(["'])(blabla)(['"]) und im Ersatztext entsprechend wieder einfügen.

        Ersatzweise lookbehind/lookahead. Macht die Sache aber nicht wirklich performanter.

        cu,
        Andreas a/k/a MudGuard

      3. Moin,

        $str = 'lorem "ipsum" dolor';
        $str = preg_replace('/"([^"]*)"/', 'ersatz', $str);
        echo $str; // lorem ersatz dolor
        

        Na dann füg duch zum "ersatz" einfach die " hinzu. Wo ist da das Problem?

        $str = preg_replace('/"([^"]*)"/', '"ersatz"', $str);
        

        Gruß Bobby

        --
        -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)