power-box.de
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 28.05.2005, 19:51   #1
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User

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 &nbsp; 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>',
              
'&nbsp;',
              
'<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$replacehighlight_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').'"',
              
'&nbsp;',
              
'<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$replacehighlight_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;

__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer

Geändert von steffenk (28.05.2005 um 20:47 Uhr).
steffenk ist offline   Mit Zitat antworten
Linktipp

Alt 29.05.2005, 00:02   #2
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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("/&gt;(.*)&lt;/Ui""&gt;<span class=\"html-highlight-text\">\\1</span>&lt;",$tmp);
    
//Strings
    
$tmp=preg_replace("/&quot;(.*)&quot;/Ui""<span class=\"html-highlight-string\">&quot;\\1&quot;</span>",$tmp);
    
//Kommentare
    
$tmp=preg_replace("/&lt;!--(.*)--&gt;/Ui""<span class=\"html-highlight-comment\">&lt;!--\\1--&gt;</span>",$tmp);
    
//table,form,img
    
$tmp=preg_replace("/&lt;input(.*)&gt;/Ui""<span class=\"html-highlight-form\">&lt;input\\1&gt;</span>",$tmp);
    
$tmp=preg_replace("/&lt;select(.*)&gt;/Ui""<span class=\"html-highlight-form\">&lt;select\\1&gt;</span>",$tmp);
    
$tmp=preg_replace("/&lt;option(.*)&gt;/Ui""<span class=\"html-highlight-form\">&lt;option\\1&gt;</span>",$tmp);
    
$tmp=preg_replace("/&lt;textarea(.*)&gt;/Ui""<span class=\"html-highlight-form\">&lt;textarea\\1&gt;</span>",$tmp);
    
$tmp=preg_replace("/&lt;img(.*)&gt;/Ui""<span class=\"html-highlight-img\">&lt;img\\1&gt;</span>",$tmp);
    
$tmp=preg_replace("/&lt;map(.*)\/map&gt;/Ui""<span class=\"html-highlight-img\">&lt;map\\1/map&gt;</span>",$tmp);
    
$tmp=preg_replace("/&lt;object(.*)\/object&gt;/Ui""<span class=\"html-highlight-object\">&lt;object\\1/object&gt;</span>",$tmp);
    
$search=Array('&lt;table',
                  
'&lt;/table&gt;',
                  
'&lt;form',
                  
'&lt;/form&gt;');
    
$replace=Array('<span class="html-highlight-table">&lt;table',
                  
'&lt;/table&gt;</span>',
                  
'<span class="html-highlight-form">&lt;form',
                  
'&lt;/form&gt;</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;

__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 29.05.2005, 09:16   #3
Guest
 
Registriert seit: Mar 2004
Ort: Süddeutschland
Jakob macht alles soweit korrekt
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).
Jakob ist offline   Mit Zitat antworten
Alt 29.05.2005, 10:21   #4
TP-Veteran
 
Benutzerbild von fettmme
 
Registriert seit: Feb 2002
fettmme bringt sich richtig einfettmme bringt sich richtig ein
Danke
__________________
class GetProfileCustomerEntityReceiverInformationReceiverAndProgrammingInforma...{
public function __construct(){ if(!$this) die(' '); } }
http://www.thedailywtf.com/
fettmme ist offline   Mit Zitat antworten
Alt 29.05.2005, 14:02   #5
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
@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.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 29.05.2005, 16:02   #6
Guest
 
Registriert seit: Mar 2004
Ort: Süddeutschland
Jakob macht alles soweit korrekt
Ja, das hab ich eben gemacht. Und es klappt gut.
Jakob ist offline   Mit Zitat antworten
Alt 29.05.2005, 19:34   #7
TP-Moderator
 
Benutzerbild von hero-master
 
Registriert seit: Mar 2003
Ort: Münstertal (bei Freiburg)
hero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKE
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
__________________
Grüße Nico

Meine kleinen CSS-Tutorials
hero-master ist offline   Mit Zitat antworten
Alt 29.05.2005, 20:36   #8
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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"
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 29.05.2005, 20:44   #9
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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('&quot;','"',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
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer

Geändert von steffenk (29.05.2005 um 23:14 Uhr).
steffenk ist offline   Mit Zitat antworten
Alt 29.05.2005, 20:58   #10
TP-Moderator
 
Benutzerbild von hero-master
 
Registriert seit: Mar 2003
Ort: Münstertal (bei Freiburg)
hero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKE
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?
__________________
Grüße Nico

Meine kleinen CSS-Tutorials

Geändert von hero-master (29.05.2005 um 21:03 Uhr).
hero-master ist offline   Mit Zitat antworten
Alt 29.05.2005, 21:43   #11
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 29.05.2005, 21:58   #12
TP-Moderator
 
Benutzerbild von hero-master
 
Registriert seit: Mar 2003
Ort: Münstertal (bei Freiburg)
hero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKE
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