 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Fragen stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
28.05.2005, 19:51
|
#1
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
PHP Highlighter
Um PHP Quelltext in HTML-Seiten darzustellen, gibt es eine eigene PHP-Funktion, die das für einen erledigt.
Die Funktion heisst highlight_string. Sie wandelt den Quelltext um - die htmlentities werden maskiert und die Farbinformationen werden mittels der in der php.ini angegebenen Farben umgewandelt.
Leider benutzt die Funktion die veraltete Font-Funktion (bei PHP-Versionen < 5)
(<font color="#ff0000">...</font>)
Hat man ein CSS-Design, so stören diese veralteten Tags.
Aus diesem Grund habe ich eine kleine Funktion geschrieben, die diese Tags durch spans ersetzt. Die Funktion zum highlighten ist integriert, so das man einfach diese Funktion statt der Standarfunktion aufrufen kann. Der Syntax ist genau der gleiche:
php_highlight($source);
oder
$var=php_highlight($source,true);
Die Font-Angaben werden in spans mit Klassenangaben umgewandelt. Dadurch ist man sogar in der Lage, ein eigenes Farbschema zu benutzen.
Möchte man die Standardfarben benutzen, so muss man nur vorher die Funktion GetHighlightCSS() auszugeben, es wird die CSS-Definition geschrieben.
Natürlich kann man das auch in seine CSS auslagern.
Zusätzlich habe ich noch die Zeichen <br /> und ersetzt, wer es anders möchte, kann es leicht ändern.
PHP-Code:
function php_highlight($source,$no_echo=false) {
$search=Array('<font color="'.ini_get('highlight.bg').'">',
'<font color="'.ini_get('highlight.html').'">',
'<font color="'.ini_get('highlight.default').'">',
'<font color="'.ini_get('highlight.keyword').'">',
'<font color="'.ini_get('highlight.string').'">',
'<font color="'.ini_get('highlight.comment').'">',
'</font>',
' ',
'<br />');
$replace=Array('<span class="highlight-bg">',
'<span class="highlight-html">',
'<span class="highlight-default">',
'<span class="highlight-keyword">',
'<span class="highlight-string">',
'<span class="highlight-comment">',
'</span>',
' ',
"\n");
$highlightstring=str_replace($search, $replace, highlight_string($source,true));
if($no_echo)
return $highlightstring;
else echo $highlightstring;
}
function GetHighlightCSS() {
$linebreak="\n";
$s="/* Highlight Definition for Inline-Elements */$linebreak
.highlight-bg {color: ".ini_get('highlight.bg').";}$linebreak
.highlight-html {color: ".ini_get('highlight.html').";}$linebreak
.highlight-default {color: ".ini_get('highlight.default').";}$linebreak
.highlight-keyword {color: ".ini_get('highlight.keyword').";}$linebreak
.highlight-string {color: ".ini_get('highlight.string').";}$linebreak
.highlight-comment {color: ".ini_get('highlight.comment').";}$linebreak
$linebreak";
return $s;
}
Und hier die Ersetzung für PHP >= 5 :
PHP-Code:
function php_highlight($source,$no_echo=false) {
$search=Array('style="color: '.ini_get('highlight.bg').'"',
'style="color: '.ini_get('highlight.html').'"',
'style="color: '.ini_get('highlight.default').'"',
'style="color: '.ini_get('highlight.keyword').'"',
'style="color: '.ini_get('highlight.string').'"',
'style="color: '.ini_get('highlight.comment').'"',
' ',
'<br />');
$replace=Array('class="highlight-bg"',
'class="highlight-html"',
'class="highlight-default"',
'class="highlight-keyword"',
'class="highlight-string"',
'class="highlight-comment"',
' ',
"\n");
$highlightstring=str_replace($search, $replace, highlight_string($source,true));
if($no_echo)
return $highlightstring;
else echo $highlightstring;
}
function GetHighlightCSS() {
$linebreak="\n";
$s="/* Highlight Definition for Inline-Elements */$linebreak
.highlight-bg {color: ".ini_get('highlight.bg').";}$linebreak
.highlight-html {color: ".ini_get('highlight.html').";}$linebreak
.highlight-default {color: ".ini_get('highlight.default').";}$linebreak
.highlight-keyword {color: ".ini_get('highlight.keyword').";}$linebreak
.highlight-string {color: ".ini_get('highlight.string').";}$linebreak
.highlight-comment {color: ".ini_get('highlight.comment').";}$linebreak
$linebreak";
return $s;
}
Geändert von steffenk (28.05.2005 um 20:47 Uhr).
|
|
|
29.05.2005, 00:02
|
#2
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
Hier ein kleiner Zusatz, wenn man auch HTML-Schnipsel einfärben will.
Das Script ist nicht perfekt, es kann keine komplexen Verschachtelungen. Für einfache Schnipsel reicht es allemal.
Zuerst die nötige CSS-Definition:
Code:
.html-highlight-bg {color: #000080;}
.html-highlight-comment {color: #808080;}
.html-highlight-string {color: #0000ff;}
.html-highlight-img {color: #800080;}
.html-highlight-object {color: #808000}
.html-highlight-table {color: #008080;}
.html-highlight-form {color: #ff8000;}
.html-highlight-text {color: #000000;}
und die Funktion, die das Highlighting übernimmt:
PHP-Code:
function HTML_Highlight($source,$no_echo=false) {
$tmp=htmlentities($source);
//text
$tmp=preg_replace("/>(.*)</Ui", "><span class=\"html-highlight-text\">\\1</span><",$tmp);
//Strings
$tmp=preg_replace("/"(.*)"/Ui", "<span class=\"html-highlight-string\">"\\1"</span>",$tmp);
//Kommentare
$tmp=preg_replace("/<!--(.*)-->/Ui", "<span class=\"html-highlight-comment\"><!--\\1--></span>",$tmp);
//table,form,img
$tmp=preg_replace("/<input(.*)>/Ui", "<span class=\"html-highlight-form\"><input\\1></span>",$tmp);
$tmp=preg_replace("/<select(.*)>/Ui", "<span class=\"html-highlight-form\"><select\\1></span>",$tmp);
$tmp=preg_replace("/<option(.*)>/Ui", "<span class=\"html-highlight-form\"><option\\1></span>",$tmp);
$tmp=preg_replace("/<textarea(.*)>/Ui", "<span class=\"html-highlight-form\"><textarea\\1></span>",$tmp);
$tmp=preg_replace("/<img(.*)>/Ui", "<span class=\"html-highlight-img\"><img\\1></span>",$tmp);
$tmp=preg_replace("/<map(.*)\/map>/Ui", "<span class=\"html-highlight-img\"><map\\1/map></span>",$tmp);
$tmp=preg_replace("/<object(.*)\/object>/Ui", "<span class=\"html-highlight-object\"><object\\1/object></span>",$tmp);
$search=Array('<table',
'</table>',
'<form',
'</form>');
$replace=Array('<span class="html-highlight-table"><table',
'</table></span>',
'<span class="html-highlight-form"><form',
'</form></span>');
$tmp=str_replace($search, $replace,$tmp);
$highlightstring='<code><span class="html-highlight-bg">'.$tmp.'</span></code>';
if($no_echo)
return $highlightstring;
else echo $highlightstring;
}
|
|
|
29.05.2005, 09:16
|
#3
|
|
Guest
Registriert seit: Mar 2004
Ort: Süddeutschland
|
So ein Ding ist gut. Danke.
Es hat mich nämlich schon irre gestört da PHP doch schon überall XML konforme Tags verwendet und dann mit font kommt ...
Wenn ich aber jetzt "gemischten" Code habe, also php und html, dann muss ich zuerst die php Bereiche mit RegExp ausfindeig machen, oder wie kann man das Multi-Highlighten?
Geändert von Jakob (29.05.2005 um 09:19 Uhr).
|
|
|
29.05.2005, 10:21
|
#4
|
|
TP-Veteran
Registriert seit: Feb 2002
|
Danke 
__________________
class GetProfileCustomerEntityReceiverInformationReceiverAndProgrammingInforma...{
public function __construct(){ if(!$this) die(' '); } }
http://www.thedailywtf.com/
|
|
|
29.05.2005, 14:02
|
#5
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
@Jacob: Multihighlighten können die Routinen nicht. Aber man kann die Strings ja zerlegen, es gibt ja die PHP Start- und Endtags. Das sollte kein Problem sein.
|
|
|
29.05.2005, 16:02
|
#6
|
|
Guest
Registriert seit: Mar 2004
Ort: Süddeutschland
|
Ja, das hab ich eben gemacht.  Und es klappt gut.
|
|
|
29.05.2005, 19:34
|
#7
|
|
TP-Moderator
Registriert seit: Mar 2003
Ort: Münstertal (bei Freiburg)
|
Hi Steffen 
Ich verstehe nun einige Dinge noch nicht ganz 
Der Code wird angezeigt und wiedergegebn, soweit alles gut
Frage1:
Wie mache ich das mit dem GetHighlightCSS() ?
Das klappt bei mir noch nicht so wirklich
Frage2 (Schönheitsfrage  ):
Kann man die <span>s auch untereinander anordnen lassen?
Danke 
|
|
|
29.05.2005, 20:36
|
#8
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
Hi Nico,
zu 1: das sind nur die CSS-Definitionen.
Aufgerufen wird das z.B. so:
PHP-Code:
echo '<style type="text/css">'.GetHighlightCSS().'</style>';
Man kann sich das auch kopieren und in eine CSS auslagern. Bei dieser Funktion werden halt die Standardfarben aus der php.ini ausgelesen.
zu 2: das kannst Du natürlich ergänzen, dazu brauchst Du lediglich hinter </span> einen Umbruch zufügen, also z.B. "</span>\n"
|
|
|
29.05.2005, 20:44
|
#9
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
Und hier noch der Code für einen CSS-Highlighter.
Der Einfachheit halber hier die CSS-Anweisung:
Code:
.css-highlight-bg {color: #800080;}
.css-highlight-comment {color: #808080;}
.css-highlight-keywords {color: #0000ff;}
.css-highlight-elements {color: #ff0000;}
.css-highlight-values {color: #804040;}
und die Funktion zum Highlighten:
PHP-Code:
function CSS_Highlight($source,$no_echo=false) {
$tmp=str_replace('"','"',htmlentities($source)); //comments
$tmp=preg_replace('/\/\*(.*)\*\//Uis', '<span class="css-highlight-comment">/*\\1*/</span>',$tmp);
//keywords
$tmp=preg_replace('/\{(.*)\}/Uis', '{<span class="css-highlight-keywords">\\1</span>}',$tmp);
//elements
$tmp=preg_replace("/([^a]):(.*);/Uis", "\\1:<span class=\"css-highlight-elements\">\\2</span>;",$tmp);
//values
$tmp=preg_replace('/#(([0-9a-f]){6}|([0-9a-f]){3})/i','<span class="css-highlight-values">#\\1</span>',$tmp);
$tmp=preg_replace('/(\d+)(px|em|pt|;)/Uis','<span class="css-highlight-values">\\1</span>\\2',$tmp);
$highlightstring='<code><span class="css-highlight-bg">'.$tmp.'</span></code>';
if($no_echo)
return $highlightstring;
else echo $highlightstring;
}
An dieser Stelle nochmal herzlichen Dank an StuckMojo für die Unterstützung bei den Echsen 
Geändert von steffenk (29.05.2005 um 23:14 Uhr).
|
|
|
29.05.2005, 20:58
|
#10
|
|
TP-Moderator
Registriert seit: Mar 2003
Ort: Münstertal (bei Freiburg)
|
Zitat:
|
Zitat von St@eff.en
zu 1: das sind nur die CSS-Definitionen.
Aufgerufen wird das z.B. so:
PHP-Code:
echo '<style type="text/css">'.GetHighlightCSS().'</style>';
|
Danke
Zitat:
|
Zitat von St@eff.en
zu 2: das kannst Du natürlich ergänzen, dazu brauchst Du lediglich hinter </span> einen Umbruch zufügen, also z.B. "</span>\n"
|
Das hatte ich auch mal probiert und hat irgendwie nicht geklappt, hab wohl das Zeichen verkehrt herum reingeschrieben
PHP-Code:
$replace=Array('<span class="highlight-bg">',
'<span class="highlight-html">',
'<span class="highlight-default">',
'<span class="highlight-keyword">',
'<span class="highlight-string">',
'<span class="highlight-comment">',
'</span>\n',
Und noch ne Kleinigkeit:
Kann man irgendwie das <code> durch <pre> erstezen? 
Geändert von hero-master (29.05.2005 um 21:03 Uhr).
|
|
|
29.05.2005, 21:43
|
#11
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
ersetze '</span>\n' durch "</span>\n", sonst wird das nicht interpretiert.
Das <code> kann man im PHP-Highlighter nicht ersetzen, man kann es aber hinterher machen.
Beim HTML- und CSS-Highlighter ist es in der Funktion, da kannst Du es ersetzen.
Aber warum ? Du kannst das ganze doch zusätzlich in ein pre packen.
|
|
|
29.05.2005, 21:58
|
#12
|
|
TP-Moderator
Registriert seit: Mar 2003
Ort: Münstertal (bei Freiburg)
|
Zitat:
|
Zitat von St@eff.en
ersetze '</span>\n' durch "</span>\n", sonst wird das nicht interpretiert.
|
Jop, danke 
Habs aber nun doch so belassen, w | | |