Regex - Zwischen 2 Zeichen auslesen
ebody
- regex
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.
Gruß ebody
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.
Moin,
Weitere Versuche waren:
- "([^"]*)" Aber es wird immer ipsum inkl. " erfasst.
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
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
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.
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
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.
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
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