【问题标题】:PHP syntax highlighting [closed]PHP语法高亮[关闭]
【发布时间】:2008-10-23 15:46:20
【问题描述】:

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

搜索客户端语法高亮脚本 (JavaScript)。

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

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

澄清:

我正在寻找一个用 PHP 编写的代码高亮软件,而不是 for PHP(因为我需要在 PHP 中使用它)。

【问题讨论】:

  • 如果您列出需要语法高亮显示的语言会有所帮助。
  • 我明确不想限制这一点。目标语言应该无关紧要:任何值得其盐分的语法突出显示引擎都可以扩展为足够好地处理(几乎)所有语言。我不搜索仅适用于一小部分子集的专用版本。
  • 我围绕 Pygments 库编写了一个 PHP 包装器,它支持 种语言。我在几个网站上都用过,效果很好,也许有人会觉得它有用:github.com/igorpan/PHPygmentizator

标签: php syntax-highlighting


【解决方案1】:

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

Hyperlight

使用非常简单:只需使用

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

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

【讨论】:

  • 这很好。我希望它能够检测到方法/构造函数以及变量声明中的类型。
  • 添加起来并不难。赞! Here 是我的通用代码荧光笔,它可以合理地处理多种语言。测试:Java、C#、JavaScript、AS3、C、C++、Lua
【解决方案2】:

[我将此答案标记为 Community 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

它使用 样式标记。

它也被集成到dojo toolkit(作为一个dojox项目:dojox.lang.highlight

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

【讨论】:

【解决方案3】:

我发现了这个用 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/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>

【讨论】:

  • 我喜欢它将语言信息存储在正则表达式数组中。如果您想获得更具体的突出显示,应该很容易为不同的语言提供不同的正则表达式数组。
  • 请将您的代码更新为 php 7
【解决方案4】:

可能值得关注Pear_TextHighlighter (documentation)

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

【讨论】:

    【解决方案5】:

    我遇到了完全相同的问题,但是由于我的时间很短并且需要非常好的代码覆盖率,所以我决定围绕 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 事件提供自动语言识别。我可能会在本周的某个时间将其公开,因为我需要稍微美化结构并编写一些基本文档。如果你为它提供足够的“学习”数据,它可以非常好地识别语言,我甚至测试了缩小的 javascript 和具有相似关键字和结构的语言,它从未犯过错误。

    【讨论】:

    • 谢谢,有了自动语言识别,我希望它会更好。尽管围绕 Pygments 构建包装器是一把双刃剑:它提供了对数量惊人的语言的支持,但不能在共享主机上的网站上使用。
    【解决方案6】:

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

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

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

    【讨论】:

      【解决方案7】:

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

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

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

      【讨论】:

      • “核心类超过 1000 行代码” 等等,什么?不,我会知道的。它要短得多——我只是尝试将所有核心功能(即几个类)放入一个文件中,以使其更易于分发。一个错误,事后看来。此外,没有逐行处理。它基本上是一个普通的词法分析器(只有它还可以处理递归标记定义)。 – 也就是说,您的代码看起来也不错。我一定会看看的。
      【解决方案8】:

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

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

      【讨论】:

      • 因为那当然只会突出 PHP 代码。另外,因为这个函数很烂,因为它根本无法自定义。
      • 哦,你可以通过highlight.comment之类的ini设置来配置它:)
      • 此外,它输出内联样式,而不是 css 类,这既可怕又不是 OP 要求的。
      • 它并没有我所说的“配置”。你可以选择颜色。就是这样。您无法控制行号、间距、突出显示的语言、交替行颜色、突出显示的行、突出显示的小节以及许多语法突出显示中常见的其他功能。
      【解决方案9】:

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

      【讨论】:

      • 但它只支持PHP代码,这不是必需的。
      【解决方案10】:

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

      【讨论】:

      • 这仅适用于 PHP,不适用于其他语言。
      猜你喜欢
      • 2011-07-16
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 2011-02-11
      相关资源
      最近更新 更多