Till: preg_replace(): Leerzeichen ersetzen

Moin Freaks,

dieser String
"Das ist {jetzt und hier} ein {l e i c h t e r} Text"
soll gewandelt werden in
"Das ist {jetzt_und_hier} ein {l_e_i_c_h_t_e_r} Text"

Also Leerzeichen innerhalb der {} ersetzen. Ich komme mit preg_replace() nicht weiter:
echo preg_replace("!({)\s*(})!U","\1_\2",$text);
...und viele andere Spielarten auch tun nicht das Richtige.

Hat das bitte zufällig jemand auf der Tastatur?

DANKE - Till

  1. Hallo Till,

    Zuminest, was dein Beispiel anbelangt, tut es auch str_replace(' ', '_', $text)

    Gruß,

    Dieter

    1. Hallo Dieter,

      Zuminest, was dein Beispiel anbelangt, tut es auch str_replace(' ', '_', $text)

      schön wärs: Ich will ja nur innerhalb der {} die Leerzeichen ersetzen:

      ...soll gewandelt werden in
      "Das ist {jetzt_und_hier} ein {l_e_i_c_h_t_e_r} Text"

      Till

      1. ...bin jetzt ein Stück weiter:

        preg_replace("!({)(.*?)(})!","$1".str_replace(' ','_','$2')."$3",$text);
        klappt noch nicht ganz.

        Aber getestet mit
        preg_replace("!({)(.*?)(})!","$1".str_replace(' ','_','Omi und Opi')."$3",$text);

        kommt das dabei raus:
        "Das {Omi_und_Opi} Text und {Omi_und_Opi} der andere!"

        Also wird $2 irgendwie falsch interpretiert bzw. nicht in str_replace() rübergenommen.

        Till

        1. Das liegt glaube ich an den einfachen ''...
          Beispiel:

          $testvar = "foo";
          echo "$testvar";
          echo "<br>";
          echo '$testvar';

          müsste asugeben:

          foo
          $testvar

          => in '' werden die Varis nicht eingesetzt... versuchs mal mit ""

          --
          Cya, mewX
      2. Hallo Till.

        Zuminest, was dein Beispiel anbelangt, tut es auch str_replace(' ', '_', $text)

        schön wärs: Ich will ja nur innerhalb der {} die Leerzeichen ersetzen:

        Dann suche per strpos() nach „{“, merke dir die Position, suche per strrpos() nach „}“ und merke dir diese Position.

        Diese beiden Zahlen verwendest du nun als Parameter für substr(), wessen zurückgegebenen Teilstring du wie oben erwähnt mit str_replace() behandelst.

        Du merkst: es *ist* möglich, auf reguläre Ausdrücke zu verzichten. Aus Performance-Gründen solltest du dies auch tun, wo immer es möglich ist.

        Einen schönen Sonntag noch.

        Gruß, Ashura

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        mathbr:del.icio.us/ mathbr:w00t/
        1. Dann suche per strpos() nach „{“, merke dir die Position, suche per strrpos() nach „}“ und merke dir diese Position.

          Diese beiden Zahlen verwendest du nun als Parameter für substr(), wessen zurückgegebenen Teilstring du wie oben erwähnt mit str_replace() behandelst.

          Du merkst: es *ist* möglich, auf reguläre Ausdrücke zu verzichten. Aus Performance-Gründen solltest du dies auch tun, wo immer es möglich ist.

          Danke. Es gibt aber beliebig viele Klammern im Text, was dann auch noch eine Schleife erfordert.

          ICH HABE ABER NUN DIE LÖSUNG!:
          preg_replace("/({)(.*?)(})/e","'$1'.str_replace(' ','_', '$2').'$3'",$text);

          Schönen Sonntag - Till

          1. Hallo Till,

            Der Vollstaendigkeit halber noch eine Loesung mit preg_replace_callback():

            print $text = 'E i n m a l  ohne und (e i n m a l) mit Klammer und noch e i n m a l  ohne und (e i n m a l) mit Klammer';
            print "\n";
            $pattern = "~((([\w ]*))[^(]*?)+~";
            print preg_replace_callback($pattern,'my_callback', $text);

            function my_callback($matches)
            {
              return str_replace(' ','_', $matches[0]);
            }

            Gruß,

            Dieter

            1. Hallo Dieter,

              Danke! Das könnte ich auch gute gebrauchen.

              Meine Variante "kürzte" ich nun auf
              preg_replace("/({)(.*?)(})/e","'$1'.str_replace(' ','_', '$2').'$3'",$text);

              Till