Habe Verständnissprobleme mit preg_replace :-(

E

encom

Hallo, ich lade einen Text aus einer Datenbank.
Dieser Text stellt Delphicode dar. Nun möchte ich bstimmte Wörter fett und farblich darstellen lassen.

Mein Problem ist nun, dass wenn ich z.B. das Wort "end" fett und blau darstelln will, er auch den Teil end in Wörtern fett und blau darstellt.

Es sollen aber nur die ganzen Worte end geändert werden, dabei muß jedoch beachtet weden dass end allein in einer Zeile stehen kann, dass hinter end auch ein ; stehen darf oder das hinter end ein Zeilenumbruch vorhanden ist.

Kann mir da einer weiterhelfen?

Danke
 
Dafür kannst du \b als Bedingung einsetzen.
Damit signalisierst du im Ausdruck eine "Wortgrenze".

"Wortgrenze" bedeutet dabei Folgendes:
\w wird nicht gefolgt von\w
oder
\W wird nicht gefolgt von\W

das müsste in deinem Fall so aussehen:
Code:
preg_replace('@\b(end)\b@i', '<b style="color:blue">\\1</b>', $str);
 
Vielen Dank für den Tipp,
Wofür steht eigentlich das @?

Kann mir auch einer erklären wie ich das ganze nun mit arrays umsetzen kann?
Es gibt ja einige Wörter mehr als das "end", da habe ich mir gedacht dass ich nicht 50 mal die Zeile schreiben muß, ein array mit allen zu highlightenden Wörtern zu erstellen

das array sieht so aus
PHP:
$keywords = array('begin','end','var','implementation','procedure','function','try','finally','except','if','then','else','while','do','with');

nur weiß ich nicht wie ich nun die Zeile
PHP:
$text = preg_replace('@\b(end)\b@i', '<b style="color:blue">\\1</b>', $text);

so anpassen muß dass alle Wörter gehighlighted werden

Danke
 
Das '@' steht für Beginn und Ende des Suchmusters.... ist eigentlich egal, welches Zeichen man da nimmt.... man muss nur drauf achten, dass man dieses Zeichen dann innerhalb des Musters escaped, falls es dort vorkommt.

Zu dem Array.... das geht recht bequem... implode() den Array im Suchmuster mit dem Delimiter |... dieser ist in Teilmustern(das, was sich zwischen runden Klammern befindet) für Alternativen zuständig.

Code:
preg_replace('#\b('.implode('|',$keywords).')\b#i','<b style="color:blue">\\1</b>',$str);
 
Ach jetzt habe ich doch noch ein Problem.

ich benutze zur zeit folgendes um alles zwischen ' und ' zu highlighten
PHP:
$text = preg_replace("(\'(.+?)\')is",$farbe[2]."$0</span>",$text);   #' '

Nun es funktioniert bei den meisten Texten ganz gut, nur jetzt musste ich feststellen dass manchmal ohne ersichtlichen Grund nicht nur das zwischen den ' gehighlighted wird sondern viel mehr text.

Fällt jemandem ein Fehler auf?

Oh man, jetzt habe ich es hinbekommen und gleioch einen neuen Fehler entdeckt den ich nicht in den Griff bekomme.

PHP:
$text = preg_replace("(\{(.+?)\})is",$farbe[0]."$0</span>",$text);   #{ }
   $text = preg_replace("(\/\/(.*?)\n)is",$farbe[0]."$0</span>",$text); #//
   $text = preg_replace("(\'(.*?)\')is",$farbe[2]."$0</span>",$text);   #' '

jetzt habe ich z.B. folgendes im Text stehen
URL:='http://www.ensacom.de';

nun wird 'http: blau dargestellt und //www.ensacom.de grün
Wie kann ich nun verhindern dass ales hinter // was zwischen ' und ' steht beachtet werden?


Danke
 
Zuletzt bearbeitet von einem Moderator:
Das lässt sich so einfach nicht mehr machen :(
Da müsstest man schon umfangreichere String-Analysen vornehmen, bei denen man lediglich mit preg_replace() nicht weit kommt.

Wenn es nicht gegen deine Ehre geht, bei Anderen etwas zu kiebitzen, schau dir mal
http://qbnz.com/highlighter/ an....
das ist ein PHP-Syntax-Highlighter für alle erdenklichen Sprachen.... Delphi ist auch dabei :)
 
Zurück