Tobias Perschon: Regex

ich möchte alle vorkommen von [color=FARBE]TEXT[/color] ersetzen mit <span style="color:FARBE;">TEXT</span>

allerdings gibt es ein problem wenn in dem string öfters ein color tag steht:
z.b.:
$msg = "[color=red]text1[/color] Blabla [color=green]text2[/color]";

$msg = eregi_replace("[color=(.*)](.*)[/color]",'<span style="color:\1;">\2</span>',$msg);

echo $msg;

produziert:

<span style="color:red]text1[/color] Blabla [color=green;">text2</span>

wie kann ich den eregi_replace befehl anpassen das es auch funktioniert wenn mehrere color tags festgelegt werden?

  1. Hi,

    $msg = eregi_replace("[color=(.*)](.*)[/color]",'<span style="color:\1;">\2</span>',$msg);

    wie kann ich den eregi_replace befehl anpassen das es auch funktioniert wenn mehrere color tags festgelegt werden?

    Was der Befehl genau macht weiß ich nicht, aber jedenfalls sind deine Regulären Ausdrücke gierig.
    (.*) sucht den längst möglichen Treffer, während (.*?) den kürztmöglichen (also den, den du willst) sucht.

    mfG,
    steckl

    1. (.*) sucht den längst möglichen Treffer, während (.*?) den kürztmöglichen (also den, den du willst) sucht.

      dann gibt mir php diesen fehler aus:

      Warning: eregi_replace() [function.eregi-replace]: REG_BADRPT in E:\Programme\xampp\htdocs\test\rep.php on line 5

      kann bei mehreren vorkommen eigentlich das ersetzen mit den variablen //1 und //2 machen oder müssten sie beim 2ten vorkommen nicht //3 und //4 sein?

      kann man irgendwie tricksen das er den eregi_replace befehl einzelnt und unabhängig auf jedes vorkommen anwedet?

      grüße

      1. (.*) sucht den längst möglichen Treffer, während (.*?) den kürztmöglichen (also den, den du willst) sucht.

        dann gibt mir php diesen fehler aus:

        Warning: eregi_replace() [function.eregi-replace]: REG_BADRPT in E:\Programme\xampp\htdocs\test\rep.php on line 5

        Ja, den Fehler habe ich auch bekommen; mir behagt die POSIX-Syntax von den ereg-Befehlen nicht, mir den Perl-kompatiblen preg-Funktionen würde es so funktioniern:

        $msg = preg_replace("/[color=(.*?)](.*?)[/color]/i",'<span style="color:$1;">$2</span>',$msg);

        1. hoppla, die postings haben sich überschnitten!

          Danke vielmals jetzt funktioniert alles so wie es soll ;)

      2. Sorry erstmal für den doppenpost!
        Also: da php .*? nicht akzeptiert hab ich die andere regex funktion die den perl syntax verwendet genommen: (preg)

        $msg = preg_replace('[color=(.*?)](.*?)[/color]','<span style="color:\1;">\2</span>',$msg);

        das liefert das gewünschte ergebniss bist auf das ich eigentlich die beiden klammern [ und ] mit \ markieren will damit er sie bei der ausgabe weglässt...
        ([<span style="color:red;">text1</span>] Blabla [<span style="color:green;">text2</span>])

        allerdings regt sich php dann auf:

        Delimiter must not be alphanumeric or backslash

        was muss ich tun?

        1. Hi,

          was muss ich tun?

          '[color=(.*?)](.*?)[/color]'

          Du verwendest hier die eckigen Klammern als Delimiter.

          Schreibe stattdessen beispielsweise:
          '%[color=(.*?)](.*?)[/color]%'
                                   ^
          Ob der Backslash vor dem normalen Slash nötig ist weiß ich nicht genau.

          mfG,
          steckl