PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Array in preg_replace in replace-String


shihan
14.10.2004, 21:50
Hoi,

ich habe ein Problem mit dem folgenden RegEx:
$array = array("b" => "bold", "i" => "italic", "u" => "underline", "h1" => "h1", "h2" => "h2", "code" => "code");
$text = preg_replace("!\[(b|i|u|h1|h2|code)\](.+)\[/\\1\]!","<span class=\".{$array['$1']}\">$2</span>",$text);

Ich würde gerne text usw. durch <span class="bold"> ersetzen. Jetzt habe ich durch die Backreference immer das b,i,u,h1,h2 oder code.
Man darf aber leider keine CSS Klassen erstellen, die nur einen Buchstaben enthalten. Also möchte ich aus dem Array bei b z.B. bold auslesen.

Hoffe das ist einigermaßen verständlich.
Leider bekomme ich das mit dem Array nicht hin...

Danke schonmal

Ciao
Dommi


Jan Krüger
15.10.2004, 14:37
Ein Erklärungsversuch, warum es nicht geht: das $1 wird von PHP nicht sofort ersetzt, deswegen würde PHP versuchen, den Eintrag mit dem Namen '$1' im Array einzusetzen; den gibt es aber nicht. Erst, wenn der String fertig expandiert ist, wird das $1 durch den Match des Ausdrucks ausgetauscht. Abhilfe schafft hier der /e-Modifier von PCRE (eine besonders einfache Lösung gibt's danach):

$array = array(...);
$text = preg_replace('!\[(|h[12]|code)\](.+?)\[/$1\]!ie', '"<span class=\\"$array[\'$1\']\\">$2</span>"', $text);

Du kannst aber auch tricksen, indem du die CSS-Klassen z.B. einfach bbstyle_XXX benennst; das ginge beispielsweise so:

[b]$text = preg_replace('!\[([biu]|h[12]|code)\](.+?)\[/$1\]!i', '<span class="bbstyle_$1">$2</span>', $text);

shihan
15.10.2004, 16:12
Vielen Dank...

also deine erste Mögliichkeit funktioniert auch nicht, aber wieso einfach wenns auch kompliziert geht.
Bin heut irgendwann heut in der Schule dann auch drauf gekommen, dass ich das auf diese Weise lösen kann, indem ich einfach noch was davorsetze ;)

Dankeschön!

Ciao
Dommi