RegExp: Ersetzen durch n-mal ein Zeichen
Paul Brunner
- php
0 Christian Kruse0 Paul Brunner0 Tom0 Andreas Görtz0 Tom0 Christian Seiler
Hallo,
für folgendes Problem reichen meine Feld-Wald-und-Wiesen-Kenntnisse von regulären Ausdrücken nicht aus und ich weiss auch nicht so recht wonach suchen:
Ich möchen einen Ausdruck "|n|" durch n vordefinierte Zeichen[folgen] ersetzen.
Beispiel: aus "|3|" soll " " werden
Geht das überhaupt mit regulären Ausdrücken?
Gruss
Paul
Hallo Paul,
Ich möchen einen Ausdruck "|n|" durch n
vordefinierte Zeichen[folgen] ersetzen.Beispiel: aus "|3|" soll " "
werdenGeht das überhaupt mit regulären Ausdrücken?
Klar:
$text = preg_replace('!|(\d+)|!e','str_repeat(\1," ")',$text);
Naeheres in
http://de2.php.net/preg_replace
Gruesse,
CK
Hallo Christian
Klar:
$text = preg_replace('!|(\d+)|!e','str_repeat(\1," ")',$text);
$string = preg_replace("/|([0-9])|/", str_repeat(" ", ${1}), $string);
Naja, da war ich ja gar nicht so weit weg von.
Gruss
Paul
Hello Christian,
auch hierzu noch ein paar Verständnisfragen:
$text = preg_replace('!|(\d+)|!e','str_repeat(\1," ")',$text);
' Stringdelimiter
! Begin RegExp
| gesuchtes Zeichen, escaped wegen sonstiger Sonderbedeutung
(\d+) gesuchte Backreferenz, Dezimale, 1 Mal oder öfter <---
| gesuchtes Zeichen, escaped wegen sonstiger Sonderbedeutung
! End Regexp
e Was macht das e genau? <---
' Stringdelimiter
bei \d+ steht in Self \d.+ , was ist richtig?
Was macht das e als Modifier?
Wieso in 'str_repeat(\1," ") \1 ? Ist das das Zeichen für
PHP, die Nummer der 1. Backreferenz zu nehmen?
Grüße
Tom
Hallo,
$text = preg_replace('!|(\d+)|!e','str_repeat(\1," ")',$text);
bei \d+ steht in Self \d.+ , was ist richtig?
\d.+ würde auf eine Ziffer, gefolgt von einem oder mehr beliebigen Zeichen matchen, ist hier also nicht richtig.
Was macht das e als Modifier?
Das e sorgt dafür, dass der String im Replacement als PHP-Code ausgeführt wird, hier also die Funktion str_repeat() aufgerufen wird. Ohne das e würde er den Match lediglich durch die Zeichenkette 'str_repeat(\1," ")' ersetzen.
Wieso in 'str_repeat(\1," ") \1 ? Ist das das Zeichen für
PHP, die Nummer der 1. Backreferenz zu nehmen?
Das ist ein Fehler, richtig ist "\1". Außerdem sind die Parameter in str_replace() vertauscht. Insgesamt muss der Befehl also
$text = preg_replace('!|(\d+)|!e','str_repeat(" ","\1")',$text);
lauten.
Gruß,
Andreas.
Hello,
Das ist ein Fehler, richtig ist "\1". Außerdem sind die Parameter in str_replace() vertauscht. Insgesamt muss der Befehl also
$text = preg_replace('!|(\d+)|!e','str_repeat(" ","\1")',$text);
Danke,
so langsam lichtet sich der Nebel - zumindest bei diesen einfachen Aufgaben...
Tom
Hallo Andreas,
Wieso in 'str_repeat(\1," ") \1 ? Ist das das Zeichen für
PHP, die Nummer der 1. Backreferenz zu nehmen?Das ist ein Fehler, richtig ist "\1".
Nein, beides (!) ist richtig. Das ist alles eine Frage des Quotings.
Die Zeichenektte im Speicher muss so aussehen: ...\1...
\1 ist dann die Backreferenz. Das Problem ist: oft muss man Backslashes () kodieren. Wenn man nun eine Zeichenkette '...\1...' und eine andere '...\1...' hat, dann ergibt _beides_ dasselbe. (man möge beide Strings mit echo ausgeben) Das liegt daran, wie ein String geparst wird. Wenn PHP ein -Zeichen in einer Zeichenkette in *einfachen* Anführungszeichen findet, dann liest PHP das darauffolgende Zeichen ein. Wenn das darauffolgende Zeichen ein '-Zeichen oder ein -Zeichen ist, dann wird *nur* das Zeichen dem String hinzugefügt. Wenn das darauffolgende Zeichen etwas anderes ist, dann wird der Backslash *und* das darauffolgende Zeichen hinzugefügt.
Bsp:
echo '''; // ergibt: '
echo '\a'; // ergibt: \a
echo '\'; // ergibt: \
echo '\1'; // ergibt: \1
echo '\n'; // ergibt: \n
etc.
Anders sieht es dagegen aus, wenn die Zeichenkette in *doppelten* Anführungszeichen steht. Dann werden noch *zusätzliche* Escape-Sequenzen interpretiert. z.B. \n, \r, \1, \015, etc. Bei doppelten Anführungszeichen muss man also \1 schreiben, da \1 in doppelten Anführungszeichen zu einer Zeichenkette führt, die nicht \1 enthält, sondern das Zeichen mit dem ASCII-Wert 1.
Viele Grüße,
Christian