39

我正在寻找一个可以定制的PHP 语法高亮引擎(即我可以为新语言提供我自己的标记器)并且可以同时处理多种语言(即在同一个输出页面上)。这个引擎必须与CSS 类一起很好地工作,即它应该通过插入带有属性的<span>元素来格式化输出。class可扩展模式的奖励积分。

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

到目前为止,我坚持使用GeSHi。不幸的是,GeSHi 的失败有几个原因。主要原因是不同的语言文件定义了完全不同的、不一致的样式。我已经工作了好几个小时,试图将不同的语言定义重构为一个共同点,但是由于大多数定义文件本身都很糟糕,所以我最终想切换。

理想情况下,我希望有一个类似于CodeRayPygments或 JavaScript dp.SyntaxHighlighter的 API 。

澄清:

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

4

10 回答 10

48

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

超光

使用非常简单:只需使用

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

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

于 2009-05-04T12:36:16.727 回答
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 , 差异, DOS .bat, Bash

它使用<span class="keyword">样式标记。

它还被集成在dojo 工具包中(作为一个 dojox 项目:dojox.lang.highlight

虽然不是最流行的运行网络服务器的方式,但严格来说,Javascript 不仅在客户端实现,而且还有服务器端 Javascript 引擎/平台组合

于 2008-10-23T16:25:13.527 回答
9

我在这里找到了这个用 PHP 编写的简单通用语法荧光笔,并对其进行了一些修改:

<?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/taufik-nurrohman/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>
于 2014-03-03T04:57:43.320 回答
3

可能值得一看Pear_TextHighlighter (文档)

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

于 2008-10-24T12:31:05.267 回答
2

我遇到了完全相同的问题,但是由于我的时间很短并且需要非常好的代码覆盖率,所以我决定围绕Pygments库编写一个 PHP 包装器。

它被称为PHPygmentizator。使用起来真的很简单。我写了一本非常基础的手册。由于 PHP 主要是 Web 开发语言,因此我将结构从属于这一事实,并使其在几乎任何类型的网站中都非常容易实现。

它支持配置文件,如果这还不够,有人需要修改过程中的东西,它也会触发事件

基本上可以在我的博客的任何包含源代码的帖子上找到它的工作原理演示,例如这个

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

Any text here.

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

Any text.

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

此外,我已经制作了一个语法识别(它使用可能被归类为贝叶斯概率的算法),它可以自动识别编写的语言代码块,并且可以轻松地连接到PHPygmentizator事件之一以提供自动语言识别。我可能会在本周的某个时间将其公开,因为我需要稍微美化结构并编写一些基本文档。如果你为它提供足够的“学习”数据,它可以非常好地识别语言,我甚至测试了缩小的 javascript 和具有相似关键字和结构的语言,它从来没有犯过错误。

于 2013-02-20T00:03:45.780 回答
1

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

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

就个人而言,我使用dp.SyntaxHighlighter,但它使用客户端 Javascript,所以它不能满足您的需求。它确实有一个不错的 Windows Live 插件,但我觉得它很有用。

于 2008-10-23T18:14:33.930 回答
1

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

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

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

于 2010-08-16T03:33:28.720 回答
1

为什么不使用 PHP 的内置语法荧光笔?

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

于 2011-06-15T13:59:30.117 回答
1

PHP Prettify到目前为止运行良好,并且比highlight_string有更多的自定义

于 2016-11-07T17:52:15.013 回答
0

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

于 2009-05-02T11:43:05.670 回答