PHP语法高亮

时间:2008-10-23 15:46:21

标签: php syntax-highlighting

我正在搜索可以自定义的 PHP语法突出显示引擎(即我可以为新语言提供自己的tokenizer )并且可以处理多种语言< em>同时(即在同一输出页面上)。此引擎必须与 CSS类一起使用,即它应该通过插入装有<span>属性的class元素来格式化输出。可扩展模式的奖励点。

搜索客户端语法突出显示脚本(JavaScript)。

到目前为止,我被GeSHi困住了。不幸的是,由于几个原因,GeSHi失败了。主要原因是不同的语言文件定义了完全不同的,不一致的样式。我已经花了好几个小时试图将不同的语言定义重构为一个共同的分母,但由于大多数定义文件本身都非常糟糕,我终于想转换。

理想情况下,我希望API类似于CodeRayPygments或JavaScript dp.SyntaxHighlighter

澄清:

我正在寻找代码突出显示在 PHP中编写的软件,而不是用于 PHP(因为我需要在PHP内部使用它)。

10 个答案:

答案 0 :(得分:48)

由于现有工具没有满足我的需求,我自己写了。罗,看哪:

Hyperlight

使用非常简单:只需使用

即可
 <?php hyperlight($code, 'php'); ?>

突出显示代码。编写新的语言定义也相对容易 - 使用正则表达式和功能强大但简单的状态机。顺便说一句,我仍然需要许多定义,所以请随时贡献。

答案 1 :(得分:10)

[我将此答案标记为社区Wiki ,因为您特别正在寻找Javascript]

http://softwaremaniacs.org/soft/highlight/ 是一个PHP(以及以下支持的其他语言列表)语法高亮库:

  

Python,Ruby,Perl,PHP,XML,HTML,CSS,Django,Javascript,VBScript,Delphi,Java,C ++,C#,Lisp,RenderMan(RSL和RIB),Maya嵌入式语言,SQL,SmallTalk ,Axapta,1C,Ini,Diff,DOS .bat,Bash

它使用&lt; span class =“keyword”&gt; 样式标记。

它也已整合到dojo toolkit(作为dojox项目:dojox.lang.highlight

虽然不是最常用的运行网络服务器的方式,严格来说,Javascript不仅在客户端实现,而且还有Server-Side Javascript engine/platform combinations too

答案 2 :(得分:9)

我发现这个简单的通用语法高亮显示用PHP here编写并修改了一下:

<?php

/**
 * Original => http://phoboslab.org/log/2007/08/generic-syntax-highlighting-with-regular-expressions
 * Usage => `echo SyntaxHighlight::process('source code here');`
 */

class SyntaxHighlight {
    public static function process($s) {
        $s = htmlspecialchars($s);

        // Workaround for escaped backslashes
        $s = str_replace('\\\\','\\\\<e>', $s); 

        $regexp = array(

            // Comments/Strings
            '/(
                \/\*.*?\*\/|
                \/\/.*?\n|
                \#.[^a-fA-F0-9]+?\n|
                \&lt;\!\-\-[\s\S]+\-\-\&gt;|
                (?<!\\\)&quot;.*?(?<!\\\)&quot;|
                (?<!\\\)\'(.*?)(?<!\\\)\'
            )/isex' 
            => 'self::replaceId($tokens,\'$1\')',

            // Punctuations
            '/([\-\!\%\^\*\(\)\+\|\~\=\`\{\}\[\]\:\"\'<>\?\,\.\/]+)/'
            => '<span class="P">$1</span>',

            // Numbers (also look for Hex)
            '/(?<!\w)(
                (0x|\#)[\da-f]+|
                \d+|
                \d+(px|em|cm|mm|rem|s|\%)
            )(?!\w)/ix'
            => '<span class="N">$1</span>',

            // Make the bold assumption that an
            // all uppercase word has a special meaning
            '/(?<!\w|>|\#)(
                [A-Z_0-9]{2,}
            )(?!\w)/x'
            => '<span class="D">$1</span>',

            // Keywords
            '/(?<!\w|\$|\%|\@|>)(
                and|or|xor|for|do|while|foreach|as|return|die|exit|if|then|else|
                elseif|new|delete|try|throw|catch|finally|class|function|string|
                array|object|resource|var|bool|boolean|int|integer|float|double|
                real|string|array|global|const|static|public|private|protected|
                published|extends|switch|true|false|null|void|this|self|struct|
                char|signed|unsigned|short|long
            )(?!\w|=")/ix'
            => '<span class="K">$1</span>',

            // PHP/Perl-Style Vars: $var, %var, @var
            '/(?<!\w)(
                (\$|\%|\@)(\-&gt;|\w)+
            )(?!\w)/ix'
            => '<span class="V">$1</span>'

        );

        $tokens = array(); // This array will be filled from the regexp-callback

        $s = preg_replace(array_keys($regexp), array_values($regexp), $s);

        // Paste the comments and strings back in again
        $s = str_replace(array_keys($tokens), array_values($tokens), $s);

        // Delete the "Escaped Backslash Workaround Token" (TM)
        // and replace tabs with four spaces.
        $s = str_replace(array('<e>', "\t"), array('', '    '), $s);

        return '<pre><code>' . $s . '</code></pre>';
    }

    // Regexp-Callback to replace every comment or string with a uniqid and save
    // the matched text in an array
    // This way, strings and comments will be stripped out and wont be processed
    // by the other expressions searching for keywords etc.
    private static function replaceId(&$a, $match) {
        $id = "##r" . uniqid() . "##";

        // String or Comment?
        if(substr($match, 0, 2) == '//' || substr($match, 0, 2) == '/*' || substr($match, 0, 2) == '##' || substr($match, 0, 7) == '&lt;!--') {
            $a[$id] = '<span class="C">' . $match . '</span>';
        } else {
            $a[$id] = '<span class="S">' . $match . '</span>';
        }
        return $id;
    }
}

?>

演示: http://phpfiddle.org/lite/code/1sf-htn


更新

我刚刚在这里创建了我自己的JavaScript通用语法荧光笔的PHP端口→https://github.com/tovic/generic-syntax-highlighter/blob/master/generic-syntax-highlighter.php

使用方法:

<?php require 'generic-syntax-highlighter.php'; ?>
<pre><code><?php echo SH('&lt;div class="foo"&gt;&lt;/div&gt;'); ?></code></pre>

答案 3 :(得分:3)

值得一看Pear_TextHighlighterdocumentation

我认为默认情况下它不会完全按照您的需要输出html,但它确实提供了广泛的自定义功能(即您可以创建不同的渲染器/解析器)

答案 4 :(得分:2)

我有完全相同的问题,但因为我的时间非常短,需要非常好的代码覆盖率,所以我决定在Pygments库周围编写一个PHP包装器。

它被称为PHPygmentizator。它使用起来非常简单。我写了一篇非常基本的manual。由于PHP主要是Web开发语言,因此我将结构从属于该事实,并使其几乎可以在任何类型的网站中实现。

它支持configuration files,如果这还不够,有人需要修改过程中的内容,它也会触发events

可以在我的博客的任何帖子中找到它的工作原理,其中包含源代码this one for example

使用默认配置,您只需提供以下格式的字符串:

Any text here.

[pygments=javascript]
var a = function(ar1, ar2) {
    return null;
}
[/pygments]

Any text.

因此它突出了标签之间的代码(标签可以在配置文件中自定义),其余部分保持不变。

此外,我已经创建了一个语法识别(它使用的算法可能被归类为Bayesian probability),它可以自动识别写入哪个语言代码块并且可以轻松地连接到 PHPygmentizator 事件之一,提供自动语言识别功能。我本周可能会把它公之于众,因为我需要美化一下这个结构并写一些基本的文档。如果你为它提供足够的“学习”数据,它可以很好地识别语言,我测试了甚至缩小的javascripts和具有相似关键字和结构的语言,它从来没有犯过错误。

答案 5 :(得分:1)

另一个选择是使用Andre Simon提供的GPL Highlight GUI 程序,该程序适用于大多数平台。它将PHP(和其他语言)转换为HTML,RTF,XML等,然后您可以将其剪切并粘贴到所需的页面中。这样,处理只进行一次。

HTML也是基于CSS的,因此您可以随意更改样式。

就个人而言,我使用 dp.SyntaxHighlighter ,但使用客户端Javascript,因此无法满足您的需求。它有一个很好的Windows Live插件,虽然我觉得它很有用。

答案 6 :(得分:1)

这里有点迟到,但我一直在研究自己的PHP语法高亮库。它仍处于早期阶段,但我将其用于我博客上的所有代码示例。

刚检查出Hyperlight。它看起来很酷,但它正在做一些非常疯狂的事情。嵌套循环,逐行处理等。核心类超过1000行代码。

如果您对简单轻便的东西感兴趣,请查看Nijikodo: http://www.craigiam.com/nijikodo

答案 7 :(得分:1)

为什么不使用PHP的内置语法高亮显示器?

http://php.net/manual/en/function.highlight-string.php

答案 8 :(得分:0)

Krijn Hoetmer的PHP Highlighter提供了一个完全可定制的PHP类来突出PHP语法。它生成的HTML,在严格的doctype下验证,并且完全可以使用CSS。

答案 9 :(得分:0)

PHP Prettify到目前为止工作正常,并且比highlight_string

具有更多自定义功能