Paul Brunner: RegExp: Ersetzen durch n-mal ein Zeichen

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

  1. Hallo Paul,

    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?

    Klar:

    $text = preg_replace('!|(\d+)|!e','str_repeat(\1," ")',$text);

    Naeheres in

    http://de2.php.net/preg_replace

    Gruesse,
     CK

    --
    Der Geist ist alles. Du wirst, was du denkst.
    1. 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

      1. 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

        1. 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.

          1. 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

          2. 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