| 1 | class SyntaxHighlight {
|
| 2 |
|
| 3 | static $tokens = array();// This array will be filled from the regexp-callback
|
| 4 | public static function process($s) {
|
| 5 | $s = htmlspecialchars($s);
|
| 6 | // Workaround for escaped backslashes
|
| 7 | $s = str_replace('\\\\','\\\\<e>', $s);
|
| 8 | $regexp = array(
|
| 9 | // Punctuations
|
| 10 | '/([\-\!\%\^\*\(\)\+\|\~\=\`\{\}\[\]\:\"\'<>\?\,\.\/]+)/'
|
| 11 | => '<span class="P">$1</span>',
|
| 12 | // Numbers (also look for Hex)
|
| 13 | '/(?<!\w)(
|
| 14 | (0x|\#)[\da-f]+|
|
| 15 | \d+|
|
| 16 | \d+(px|em|cm|mm|rem|s|\%)
|
| 17 | )(?!\w)/ix'
|
| 18 | => '<span class="N">$1</span>',
|
| 19 | // Make the bold assumption that an
|
| 20 | // all uppercase word has a special meaning
|
| 21 | '/(?<!\w|>|\#)(
|
| 22 | [A-Z_0-9]{2,}
|
| 23 | )(?!\w)/x'
|
| 24 | => '<span class="D">$1</span>',
|
| 25 | // Keywords
|
| 26 | '/(?<!\w|\$|\%|\@|>)(
|
| 27 | and|or|xor|for|do|while|foreach|as|return|die|exit|if|then|else|
|
| 28 | elseif|new|delete|try|throw|catch|finally|class|function|string|
|
| 29 | array|object|resource|var|bool|boolean|int|integer|float|double|
|
| 30 | real|string|array|global|const|static|public|private|protected|
|
| 31 | published|extends|switch|true|false|null|void|this|self|struct|
|
| 32 | char|signed|unsigned|short|long
|
| 33 | )(?!\w|=")/ix'
|
| 34 | => '<span class="K">$1</span>',
|
| 35 | // PHP/Perl-Style Vars: $var, %var, @var
|
| 36 | '/(?<!\w)(
|
| 37 | (\$|\%|\@)(\->|\w)+
|
| 38 | )(?!\w)/ix'
|
| 39 | => '<span class="V">$1</span>'
|
| 40 | );
|
| 41 |
|
| 42 | $s = preg_replace_callback( '/(
|
| 43 | \/\*.*?\*\/|
|
| 44 | \/\/.*?\n|
|
| 45 | \#.[^a-fA-F0-9]+?\n|
|
| 46 | \<\!\-\-[\s\S]+\-\-\>|
|
| 47 | (?<!\\\)&quot;.*?(?<!\\\)&quot;|
|
| 48 | (?<!\\\)\'(.*?)(?<!\\\)\'
|
| 49 | )/isx' , array('SyntaxHighlight', 'replaceId'),$s);
|
| 50 |
|
| 51 | $s = preg_replace(array_keys($regexp), array_values($regexp), $s);
|
| 52 | // Paste the comments and strings back in again
|
| 53 | $s = str_replace(array_keys(SyntaxHighlight::$tokens), array_values(SyntaxHighlight::$tokens), $s);
|
| 54 | // Delete the "Escaped Backslash Workaround Token" (TM)
|
| 55 | // and replace tabs with four spaces.
|
| 56 | $s = str_replace(array('<e>', "\t"), array('', ' '), $s);
|
| 57 | return '<pre>'.$s.'</pre>' ;
|
| 58 | }
|
| 59 | // Regexp-Callback to replace every comment or string with a uniqid and save
|
| 60 | // the matched text in an array
|
| 61 | // This way, strings and comments will be stripped out and wont be processed
|
| 62 | // by the other expressions searching for keywords etc.
|
| 63 | static function replaceId($match) {
|
| 64 | $id = "##r" . uniqid() . "##";
|
| 65 |
|
| 66 | // String or Comment?
|
| 67 | if(substr($match[1], 0, 2) == '//' || substr($match[1], 0, 2) == '/*' || substr($match[1], 0, 2) == '##' || substr($match[1], 0, 7) == '<!--') {
|
| 68 | SyntaxHighlight::$tokens[$id] = '<span class="C">' . $match[1] . '</span>';
|
| 69 | } else {
|
| 70 | SyntaxHighlight::$tokens[$id] = '<span class="S">' . $match[1] . '</span>';
|
| 71 | }
|
| 72 |
|
| 73 | return $id;
|
| 74 | }
|
| 75 | }
|
| 76 |
|
| 77 | echo SyntaxHighlight::process( $your_code );
|