molily: Folge von Leerzeichen bis auf das letzte in   umwandeln

Beitrag lesen

Hallo,

Und was soll die 40 bedeuten?

\40 ist eine andere Schreibweise für ein Leerzeichen.

und wie kommt das zustande? weder in ASCII, noch in ASCII-Hexadezimal stellt die Pfirsich ein Leerzeichen dar - demzufolge auch nicht in Unicode, wenn ich richtig informiert bin.

40 ist ein oktaler Wert. 40 im Oktalsystem entspricht 32 im Dezimalsystem entspricht 20 im Hexadezimalsystem. \x20 wäre wohl eindeutiger.

" hat eine andere Bedeutung als '.

ist mir bekannt und muß es nicht gerade sein, damit der Ausdruck interpretiert, statt nur gelesen wird?

Was meinst du hier mit interpretiert? Als PHP-Code interpretiert im Zusammenhang mit dem e-Modifier? Dann lautet die Antwort »Nein«.
Zuerst einmal bewirkt " als Stringbegrenzer nur das gewöhnliche Ersetzen von Escapes ("\n", "\x0A" usw.) und Variablen ("bla $var bla"). Es hat aber in keinem Kontext etwas damit zu tun, ob der Inhalt auch später als PHP-Code ausgeführt wird. Es hat auch nichts damit zu tun, ob die $x- oder \x-Backreferences im Kontext von preg_replace funktionieren, obwohl sie wie PHP-Escapes bzw. PHP-Variablen scheinen. Der Replacement-String wird nicht beim ersten Parsen des Strings »interpretiert«. $0, $1 usw. sind keine gültigen Variablennamen und werden also nicht ersetzt (durch was auch, es bestehen ja keine Variablen mit diesen Namen zur Ausführungszeit). Backreferences der Form \0, \1 usw. müssen im Falle von doppelten Anführungszeichen maskiert werden (\0 usw.), sonst werden sie vom Parser durch die jeweiligen Oktalwerte ersetzt (http://de3.php.net/manual/en/language.types.string.php#language.types.string.syntax.double). Das Ersetzen der Backreferences durch die Matches der Subpatterns übernimmt alleine preg_replace. Danach wird der Code bei Benutzung des e-Modifiers als ein PHP-Ausdruck ausgeführt, ähnlich eval(). Für die Interpretierung des Ausdrucks selbst ist es nicht relevant, ob der Replacement-String in einfachen oder doppelten Anführungszeichen notiert ist. Das gilt beim Pattern in diesem Fall genauso.

wie dem auch sei - Dein Beispiel funktioniert bei mir nicht. Wäre nett, wenn Du es mal Stück für Stück erläutern würdest (so fürs Archiv halt ;-)

Der von dir gepostete Code ist bereit grundsätzlich besser, er hat gegenüber meinem Beispiel den Unterschied der Schreibweise sowieso eine Verbesserung des Patterns, sodass ein Leerzeichen nicht durch ein Leerzeichen ersetzt wird. Insofern wären
$s2=preg_replace('/( +) /e', "str_replace(' ', ' ', '$1').' '", $s);
oder äquivalent
$s2=preg_replace('/( +) /e', 'str_replace(' ', ' ', '$1').' '', $s);
durchaus besser. Beim zweiten wäre die Verwendung von ' und wie gesagt sauberer, aber komischerweise in diesem Fall langsamer bei der Ausführung.

Das besagte ~(bla)(\40*)(\40)~ geht natürlich in Anlehnung an siros Vorgabe davon aus, dass »bla« jeweils vor den zu ersetzenden Leerzeichen steht. Klar, dass das Pattern nicht auf deinen Beispielstring matcht. Durch das Herausnehmen von »(bla)«, das Ändern des Replacement-Strings und das Ersetzen von ( *) durch ( +) entsteht eben obiges Pattern.

Mathias