© Tristan Roberts 2012
troberts @ this domain

Highlighter.css

/**
    @author     Tristan Roberts
    @date       2010-05-16
    @package    Highlight.php
*/


.css > .attribute
{
    color:#88134f;
}

.css > .comment,.js > .comment,.php > .comment
{
    color:#236e25;
    font-style:italic;
}

.css > .keyword
{
    color:#9b4400;
}

.css > .number,.js > .number,.php > .number
{
    color:#00f;
}

.html > .comment
{
    font-style:italic;
}

.html > .doctype,.html > .comment
{
    color:#236e25;
}

.html > .tag
{
    color:#881280;
}

.html > .tag > .attribute
{
    color:#994500;
}

.js > .function
{
    color:#003369;
}

.js > .keyword,.php > .class
{
    color:#881350;
}

.php > .function
{
    color:#661aa9;
}

.php > .lang
{
    color:#dd000;
}

.php > .string
{
    color:#eb7300;
}

.php > .variable
{
    color:#825900;
}

Highlighter.php (Function)

<?php
    
    /**
        Syntax highlight a piece of code. Currently
        supports CSS, HTML, Javascript and PHP.
        
        Language profiles can be added by creating a new
        case that creates an array called "syntax" that is
        in the form of:
            brief_name
                RegEx
                HTML Replacement ("~" = "<" or ">")
        @author Tristan Roberts
        @date   2010-05-16
        @package        Highlight.php
        @param  $code   (string) The code to highlight.
        @param  $lang   (string) The language to highlight for.
            "html", "css", "php" or "js"
        @return         (string) The highlighted code.
    */

    function highlight( $code, $lang = "default" ) {
        $syntax = array( );
        
        switch ( strtolower( $lang ) ) {
            case "css":
                $syntax = array(
                    "keywords" => array(
                        "/(\:|[\s]+)([a-z-A-Z]+)(\;|[\s]+)/",
                        '$1~span class="keyword"~$2~/span~$3'
                    ),
                    "attribute" => array(
                        "/([a-z0-9A-Z-]+)\:([\s]*)/",
                        '~span class="attribute"~$1~/span~:$2'
                    ),
                    "numbers" => array(
                        "/(\:|[\s]+)([0-9\.]+)(px|pt|em)?/",
                        '$1~span class="number"~$2$3~/span~'
                    ),
                    "comment1" => array(
                        "/(\/[\*]+[^\*]*[\*]+\/)/",
                        '~span class="comment"~$1~/span~'
                    ),
                );
            break;
            case "html":
                $syntax = array(
                    "attribute" => array(
                        "/\ ([a-z-]+)\=/",
                        ' ~span class="attribute"~$1~/span~='
                    ),
                    "doctype" => array(
                        "/(\<\!DOCTYPE\ [^\>]+\>)/",
                        '~span class="doctype"~$1~/span~'
                    ),
                    "comment" => array(
                        "/(\<\!--[^-]*--\>)/",
                        '~span class="comment"~$1~/span~'
                    ),
                    "tag" => array(
                        "/(\<[^\>]+\>)/",
                        '~span class="tag"~$1~/span~'
                    ),
                );
            break;
            case "js":
                $syntax = array(
                    "comment1" => array(
                        "/(\/\*[\s\S]*?\*\/)/",
                        '~span class="comment"~$1~/span~'
                    ),
                    "numbers" => array(
                        "/([0-9]+)/",
                        '~span class="number"~$1~/span~'
                    ),
                    "keywords" => array(
                        "/(return|try|false|true|this|undefined|null|var|function|new)/",
                        '~span class="keyword"~$1~/span~'
                    ),
                    "functions" => array(
                        "/([a-zA-z0-9_]+)([\s]*\()/",
                        '~span class="function"~$1~/span~$2'
                    ),
                    "comment2" => array(
                        "/(\/\/[^\n\r]*)/",
                        '~span class="comment"~$1~/span~'
                    ),
                );
            break;
            case "php":
                $syntax = array(
                    "string2" => array(
                        '/(\"[^\"]*?\")/',
                        '~span class="string"~$1~/span~'
                    ),
                    "keywords" => array(
                        "/([^\$])(echo|case|require_once|printf|include_once|public|protected|static|private|function|return|class)(\ )/",
                        '$1~span class="function"~$2~/span~$3'
                    ),
                    "php" => array(
                        "/(\<\?php|\?\>)/",
                        '~span class="lang"~$1~/span~'
                    ),
                    "variables" => array(
                        '/(\$[a-zA-Z0-9_]+)/',
                        '~span class="variable"~$1~/span~'
                    ),
                    "string1" => array(
                        '/(\'[^\']*?\')/',
                        '~span class="string"~$1~/span~'
                    ),
                    "string3" => array(
                        '/(\`[^\`]*?\`)/',
                        '~span class="string"~$1~/span~'
                    ),
                    "number" => array(
                        "/([\d]+)/",
                        '~span class="number"~$1~/span~'
                    ),
                    "class1" => array(
                        "/(new\ [a-z0-9A-Z_]+)/",
                        '~span class="class"~$1~/span~'
                    ),
                    "class2" => array(
                        "/([a-z0-9A-Z_]+)\:\:/",
                        '~span class="class"~$1~/span~::'
                    ),
                    "function" => array(
                        "/([a-z0-9A-Z_]+)([\s]*\()/",
                        '~span class="function"~$1~/span~$2'
                    ),
                    "comment1" => array(
                        "/(\/\*[\s\S]*?\*\/)/",
                        '~span class="comment"~$1~/span~'
                    ),
                    "comment2" => array(
                        "/(\/\/[^\n\r]*)/",
                        '~span class="comment"~$1~/span~'
                    ),
                );
            break;
            default:
                return highlight_string( $code, true );
            break;
        }
        foreach ( $syntax as $label => $pair ) {
            $code = preg_replace( $pair[0], $pair[1], $code );
        }
        
        $code = str_replace( "<", "&lt;", $code );
        $code = str_replace( ">", "&gt;", $code );
        $code = preg_replace( "/(\~)([^\~]+)(\~)/", '<$2>', $code );
    
        return (string) $code;
    }
    
?>