PHP语法高亮显示
我正在寻找一个PHP语法突出显示引擎 ,可以自定义(即我可以提供自己的新语言tokenizer ),并可以同时处理多种语言(即在同一个输出页面)。 这个引擎必须和CSS类一起工作,也就是说,它应该通过插入用class
属性装饰的<span>
元素来格式化输出。 可扩展模式的奖励积分。
我不search客户端语法高亮脚本(JavaScript)。
到目前为止,我被GeSHi困住了。 不幸的是,GeSHi由于几个原因而失败了。 主要原因是不同的语言文件定义了完全不同的,不一致的风格。 我工作了几个小时,试图将不同的语言定义重构成一个共同的分母,但是由于大多数定义文件本身就非常糟糕,所以我最终希望切换。
理想情况下,我想要一个类似于CodeRay , Pygments或JavaScript dp.SyntaxHighlighter的API 。
澄清:
我正在寻找代码突出显示用PHP编写的软件,而不是PHP(因为我需要从PHP内部使用它)。
由于没有现有的工具满足我的需要,我写了我自己的。 你瞧,
的HyperLight
使用非常简单:只需使用
<?php hyperlight($code, 'php'); ?>
突出显示代码。 编写新的语言定义也相对容易 – 使用正则expression式和强大而简单的状态机。 顺便说一句,我仍然需要很多的定义,所以请随时做出贡献。
[我把这个答案标记为社区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),Mayaembedded式语言,SQL,SmallTalk,Axapta, ,差异,DOS .bat,Bash
它使用<span class =“keyword”>样式标记。
它也被集成到dojo工具包中 (作为dojox项目: dojox.lang.highlight )
虽然不是运行web服务器的最stream行的方式,但严格来说,Javascript不仅在客户端实现,而且还有服务器端JavaScript引擎/平台组合 。
我发现这个用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| \<\!\-\-[\s\S]+\-\-\>| (?<!\\\)".*?(?<!\\\)"| (?<!\\\)\'(.*?)(?<!\\\)\' )/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)( (\$|\%|\@)(\->|\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) == '<!--') { $a[$id] = '<span class="C">' . $match . '</span>'; } else { $a[$id] = '<span class="S">' . $match . '</span>'; } return $id; } } ?>
演示: http : //phpfiddle.org/lite/code/1sf-htn
更新
我只是在这里创build了我自己的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('<div class="foo"></div>'); ?></code></pre>
Pear_TextHighlighter ( 文档 )可能是值得的
我认为它不会默认地输出你想要的HTML,但它确实提供了定制的广泛function(即你可以创build不同的渲染器/parsing器)
我有完全相同的问题,但由于时间很短,需要非常好的代码覆盖率,所以我决定在Pygments库中编写一个PHP包装器。
它被称为PHPygmentizator 。 这非常简单。 我写了一个非常基本的手册 。 由于PHP是Web开发语言的主要组成部分,所以我将这个结构从属于这个事实,使得它几乎可以在任何types的网站上实现。
它支持configuration文件 ,如果这还不够,有人需要修改过程中的东西,它也会触发事件 。
关于它是如何工作的演示可以在我的博客的基本上任何职位上find,其中包含源代码, 例如 。
使用默认的configuration,你可以给它提供一个这样的格式的string:
Any text here. [pygments=javascript] var a = function(ar1, ar2) { return null; } [/pygments] Any text.
所以它突出显示标签之间的代码(标签可以在configuration文件中定制),并保持其余部分不变。
此外,我已经创build了一个语法识别库 (它使用的algorithm可能会被归类为贝叶斯概率 ),它可以自动识别哪个语言代码块被写入,并且可以很容易地连接到一个PHPygmentizator事件来提供自动语言识别。 我可能会在本周公布一段时间,因为我需要美化这个结构,写一些基本的文档。 如果你提供了足够的“学习”数据,它能够很好地识别语言,我甚至testing过缩小的JavaScript和具有相似关键字和结构的语言,而且从来没有犯过错误。
另一种select是使用Andre Simon的GPL Highlight GUI程序,该程序可用于大多数平台。 它将PHP(和其他语言)转换为HTML,RTF,XML等,然后将其剪切并粘贴到所需的页面中。 这样,处理只做一次。
HTML也是基于CSS的,所以你可以随意改变风格。
就个人而言,我使用dp.SyntaxHighlighter ,但使用客户端JavaScript,所以它不符合您的需求。 它有一个很好的Windows Live插件,但我觉得有用。
有点晚了,在这里,但我一直在我自己的PHP语法高亮库。 它还处于早期阶段,但我正在使用它在我的博客上的所有代码示例。
刚刚检出Hyperlight。 它看起来很酷,但它正在做一些非常疯狂的东西。 嵌套循环,逐行处理等。核心类超过1000行代码。
如果您对简单而轻量级的东西感兴趣,请查看Nijikodo: http ://www.craigiam.com/nijikodo
为什么不使用PHP的内置语法荧光笔?
Krijn Hoetmer的PHP Highlighter提供了一个完全可定制的PHP类来突出PHP语法。 它生成的HTML,在严格的文档types下进行validation,并且完全用CSS进行样式化。
PHP美化工作到目前为止,并有更多的定制比highlight_string