preg_replace: Etwas in einem ersetzten String nochmals ersetzen

lukelukeluke

Erfahrenes Mitglied
Hi zusammen.
Ich habe eine Funktion, welche wie in einem Forum einen angegebenen Tag ersetzt. In meinem Beispiel ist das {code} und {/code}.
Hier die Funktion:
Code:
function makecode($makeacode) {
// TABLE VOR CODE
$tablevor = "<table bgcolor=\"#CCCCCC\"><tr><td>";
// TABLE NACH CODE:
$tablenach = "</td></tr></table>";
$makeacode = preg_replace("/\{code\}(.*?)\{\/code\}/si",$tablevor."\\1".$tablenach,$makeacode);
return $makeacode; }
Ich verwende das, um in Einträgen den Sourcecode speziell zu markieren.
Nun würde ich auch noch gerne, falls jemand dieses "{code}sourcecode{/code}" verwendet, den sourcecode zwischen den code tags speziell formatieren. Das heisst, das ich beispielsweise verschiedene Wörter wie "class" oder "public" blau einfärben möchte.
Oder sobald in einer Zeile "//" vorkommt, soll ab dann hellgrau angezeigt werden.
Ich weiss jedoch nicht wie ich den Zugriff auf NUR das machen kann, was sich zwischen den {code} tags befindet. Kann man das irgendwie mit dem "\\1"?

Vielen Dank für eure Hilfe!

Gruss, Lukas
 
Hi

das macht es doch auch. In u.g. Beispiel alles, was sich zwischen [ php ] und [ /php ] befindet. Die Farben kann man glaube ich auch in der php.ini ändern, hab ich aber noch nicht probiert.

Du kannst das RegExp hier

$match = array('#\[php\](.*?)\[\/php\]#se');

ja auch durch Deine Zeichen austauschen. Du musst das natürlich austesten, inwiefern die Klammern escapted werden müssen.

PHP:
<?php
function bbcode($s)
{
   $s = str_replace("]\n", "]", $s);
   $match = array('#\[php\](.*?)\[\/php\]#se');
   $replace = array("'<div>'.highlight_string(stripslashes('$1'), true).'</div>'");
   return preg_replace($match, $replace, $s);
}
?>

Und so wie hier werden dann die Farben dargestellt.
 
Zuletzt bearbeitet:
Ich kann dir leider nicht ganz folgen...
Hast du meine Idee sicher verstanden? Hier nochmal was ich will:
Ich habe eine grosse Variable mit viel text drin.
In dieser befindet sich ein kleines textstück, welches {code} {/code} darum hat. Dieses wird dann mit meiner Funktion mit ienem grauen table hinterlegt...

In diesem Textstück wiederum, also in dem welches mit {code} {/code}umrahmt ist, befinden sich spezielle wörter die ich in einem array definiere, welche zB blau sein sollen. Das soll aber nur für den Text geschehen, welcher innerhalb von {code} {/code}ist. Der restliche Text soll davon nicht betroffen sein....
 
Hi

doch doch, ich verstehe, was Du meinst.
Du wirst Dir eine Funktion bauen müssen, wo Du eine Variable nach bestimmten Zeichenmustern (Patternmuster oder RegExp) durchsuchst. Wie die Wörter eben aussehen müssen bzw. welche Merkmale sie haben. Ich bin aber ein ziemliche Regexp-Krücke, auf diesem Weg musst Du selbst ran. http://www.regenechsen.de/regex_de/regex_1_de.html
In dieser Funktion wirst Du diese Muster dann mit der entsprechende Farbe ersetzen müssen.

Später baust Du dann diese Funktion einfach vor das Ersatz-Element (Platzhalter) \\1 oder $1. (fett), je nach Aufbau des Scriptcodes. Die muss natürlich dann auch den vor Dir vergebenen Namen haben.

In diesem Beispiel sieht man das ganz deutlich, wie die Funktion davorgebaut ist.
$replace = array("'<div>'.MeineFunktion(stripslashes('$1'), true).'</div>'");

oder

$makeacode = preg_replace("/\{code\}(.*?)\{\/code\}/si",$tablevor.meineFunktion("\\1").$tablenach,$makeacode);
return $makeacode; }

BTW: die Funktion highlight_string() ist eine phpeigene Funktion, die bestimmten Mustern im php-Scriptcode die entspr. Farbe gibt.
 
Zuletzt bearbeitet:
hm ich bin immernoch davon überzeugt, dass ich das alles gar nicht brauche ;)
ich habe folgende funktionen:
Code:
function highlight($makehighlight) {
$makehighlight = str_replace ("public","<font color=blue>puuubliic</font>",$makehighlight);
return $makehighlight; }
Code:
function makecode($makeacode) {
$tablevor = "</font><br><div align=\"center\"><table width=\"550\" border=\"1\" bordercolor=\"#666666\" style=\"border: 1px;\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"whitesmoke\"><tr><td bgcolor=\"#666666\"><div align=\"center\"><font class=\"home-text\" color=\"white\"><b>CODE</b></font></div></td></tr><tr><td><div class=\"home-text\" align=\"left\">";
$tablenach = "</div></td></tr></table></div><font class=\"home-text\">";
$makeacode = preg_replace("/\[code\](.*?)\[\/code\]/si",$tablevor.highlight('\\1').$tablenach,$makeacode);
return $makeacode; }
mit der einten suche code begin und end tags, und mache dann das table darum.
Mit der anderen, welche in dieser verwendet wird, sollte das Wort "public" ersetzt werden, aber nur innerhalb dieser code tags.
Also folgender String:
$str = "public ist cool [C0DE]ich finde auch das public cool ist[/C0DE]";
sollte folgendes ausgeben (echo makecode($str);):
public ist cool <codetable begin>ich finde auch das <font color=blue>public</font> cool ist <codetable end>
Das einzige was nicht funktioniert ist das:
preg_replace("/\[code\](.*?)\[\/code\]/si",$tablevor.highlight('\\1').$tablenach,$makeacode);
Ich suche einen weg auf das zuzugreiffen, was sich innerhalb der code tags befindet, und dies dann mit der funktion highlight() zu verändern.
Noch eine Idee? Vielen Dank!
Gruss, Lukas
 
Häng mal an deinen regex hinter "si" noch "e" sonst wird das mit dem highlight nichts.
Und vor $tablevor und nach $tablenach noch ein "

Einfach mal probieren.
 
so?:
$makeacode = preg_replace("/\[code\](.*?)\[\/code\]/sie","$tablevor.highlight('\\1').$tablenach",$makeacode);

jetzt funktioniert gar nichts mehr bzw. es gibt einen Fehler:

Parse error: parse error, unexpected '<' in /header.php(80) : regexp code on line 1
Fatal error: Failed evaluating code:
/home/www/web728/html/lookass/src/include/header.php on line 80

EDIT:
btw. wenn ich nur die "" einsetze, vor $tablevor und nach $tablenach, dann wird die Funktion highlight() angezeigt, also auf der Seite kann ich dann sehen highlight( hier mein text );. Ohne "" wird sie nicht angezeigt. Das müsste doch heissen sie wird ausgeführt... jedoch passiert nichts. Wenn ich sie direkt um alles mache funktioniert sie. Also an der Funktion liegt es nicht...
 
Zuletzt bearbeitet:
preg_replace(regex, "'DAVOR'.highlight_string(\\1,true).'DANACH'",text)

Probier's mal so .. also mit " ' ".$tabledavor" ' . highlight(\\1,true) . ' '"
 
Zurück