Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 25

Thema: PHP Highlighter

  1. #1
    TP-Special Mod Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869

    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;

    Geändert von steffenk (28.05.2005 um 20:47 Uhr)

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

  2. #2
    TP-Special Mod Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    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

  3. #3
    Guest
    Registriert seit
    Mar 2004
    Ort
    Süddeutschland
    Beiträge
    120
    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)

  4. #4
    TP-Veteran Avatar von fettmme
    Registriert seit
    Feb 2002
    Beiträge
    1.491
    Danke
    class GetProfileCustomerEntityReceiverInformationReceiverAndProgrammingInforma...{
    public function __construct(){ if(!$this) die(' '); } }
    http://www.thedailywtf.com/

  5. #5
    TP-Special Mod Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    @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

  6. #6
    Guest
    Registriert seit
    Mar 2004
    Ort
    Süddeutschland
    Beiträge
    120
    Ja, das hab ich eben gemacht. Und es klappt gut.

  7. #7
    TP-Moderator Avatar von hero-master
    Registriert seit
    Mar 2003
    Ort
    Hamburg
    Beiträge
    5.927
    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

  8. #8
    TP-Special Mod Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    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

  9. #9
    TP-Special Mod Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    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
    Geändert von steffenk (29.05.2005 um 23:14 Uhr)

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

  10. #10
    TP-Moderator Avatar von hero-master
    Registriert seit
    Mar 2003
    Ort
    Hamburg
    Beiträge
    5.927
    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)

  11. #11
    TP-Special Mod Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    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

  12. #12
    TP-Moderator Avatar von hero-master
    Registriert seit
    Mar 2003
    Ort
    Hamburg
    Beiträge
    5.927
    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, wegen dem pre
    Zitat Zitat von St@eff.en
    Aber warum ? Du kannst das ganze doch zusätzlich in ein pre packen.
    Reine Neugierde

  13. #13
    TP-Special Mod Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    Noch eine Anmerkung, die ich erst später festgestellt habe.

    - Die CSS-Funktion erwartet hinter jeder Element-Zuweisung ein ;

    Die PHP Version 4 reagiert anders als die PHP Version 5:

    - Beim PHP highlight_string braucht die 4er-Version die Tags <?php und ?> , bei der 5er können die weggelassen werden.
    - In der 4er-Version gehen die Einrückungen verloren, wenn man '&nbsp;' durch ' ' ersetzt.

    Wer die Routinen in Aktion sehen möchte, kann sich das im dislabs-Labor anschauen.

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

  14. #14
    TP-Veteran Avatar von Dome
    Registriert seit
    Feb 2004
    Ort
    Stuttgart
    Beiträge
    1.289
    jetzt hab ichs auch geblickt
    Gruß
    Dome
    __________________
    Um mal auf das Renomee-System aufmerksam zu machen: Klick
    TP Battlebay: www.tp-battlebay.de.ki (endlich wieder Online!)

  15. #15
    TP-Veteran Avatar von Dome
    Registriert seit
    Feb 2004
    Ort
    Stuttgart
    Beiträge
    1.289
    ich wollt noch fragen, wie ich textbereiche auch farbig machen kann...
    also ich mein sowas hier:

    PHP-Code:
    <?php
    echo "Das wird hier Farbig angezeigt!";
    ?>
    Geändert von Dome (05.10.2005 um 06:47 Uhr)
    Gruß
    Dome
    __________________
    Um mal auf das Renomee-System aufmerksam zu machen: Klick
    TP Battlebay: www.tp-battlebay.de.ki (endlich wieder Online!)

Seite 1 von 2 12 LetzteLetzte

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51