Выделение синтаксиса PHP

Я ищу механизм выделения синтаксиса PHP, который может быть настроен (т. Е. Я могу предоставить свои собственные токенизаторы для новых языков) и который может обрабатывать несколько языков одновременно (т.е. на той же странице вывода). Этот движок должен хорошо работать вместе с классами CSS , т. Е. Он должен форматировать вывод, вставляя элементы <span> , которые украшены атрибутами class . Бонусные баллы за расширяемую схему.

Я не ищу сценарий подсветки синтаксиса на стороне клиента (JavaScript).

До сих пор я застрял в GeSHi . К сожалению, GeSHi терпит неудачу по нескольким причинам. Основная причина в том, что разные языковые файлы определяют совершенно разные, непоследовательные стили. Я много работал, пытаясь реорганизовать различные определения языков до общего знаменателя, но поскольку большинство файлов определения сами по себе довольно плохие, я, наконец, хотел бы переключиться.

В идеале, я бы хотел иметь API, похожий на CodeRay , Pygments или JavaScript dp.SyntaxHighlighter .

Разъяснение:

Я ищу код, выделяющий программное обеспечение, написанное на PHP, а не PHP (так как мне нужно использовать его изнутри PHP).

Solutions Collecting From Web of "Выделение синтаксиса PHP"

Поскольку ни один из существующих инструментов не удовлетворил мои потребности, я написал свои собственные. И вот:

Hyperlight

Использование чрезвычайно просто: просто используйте

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

для выделения кода. Написание новых определений языков относительно просто – с использованием регулярных выражений и мощной, но простой конечной машины. Кстати, мне все еще нужно много определений, поэтому не стесняйтесь вносить свой вклад.

[Я отметил этот ответ как 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

Он использует разметку стиля <span class = "keyword"> .

Он также был интегрирован в набор инструментов dojo (как проект dojox: dojox.lang.highlight )

Хотя это и не самый популярный способ запуска веб-сервера, строго говоря, 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| \&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; } } ?> во <?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


Обновить

Я только что создал порт PHP моего собственного генератора синтаксиса синтаксиса JavaScript здесь → 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> 

Возможно, стоит посмотреть на Pear_TextHighlighter ( документация )

Я думаю, что он не будет по умолчанию выводить html точно так, как вы этого хотите, но он предоставляет обширные возможности для настройки (т. Е. Вы можете создавать разные рендереры / парсеры)

У меня была точно такая же проблема, но, поскольку я был очень коротким по времени и нуждался в действительно хорошем покрытии кода, я решил написать оболочку PHP вокруг библиотеки Pygments .

Это называется PHPygmentizator . Это очень просто использовать. Я написал очень простое руководство . Поскольку PHP является языком веб-разработки в первую очередь, я подчинил структуру этому факту и сделал его очень простым для реализации практически на любом веб-сайте.

Он поддерживает файлы конфигурации, и если этого недостаточно, и кому-то нужно модифицировать материал в процессе, он также запускает события .

Демонстрация того, как это работает, можно найти в любой записи моего блога, содержащей исходный код, например , этот .

С конфигурацией по умолчанию вы можете просто предоставить ему строку в этом формате:

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

Таким образом, он выделяет код между тегами (теги могут быть настроены в файле конфигурации), а остальные остаются нетронутыми.

Кроме того, я уже создал библиотеку распознавания синтаксиса (она использует алгоритм, который, вероятно, будет классифицирован как байесовская вероятность ), который автоматически распознает, какой блок кода языка написан и может быть легко подключен к одному из событий PHPygmentizator, чтобы обеспечить автоматическое распознавание языка. Вероятно, я расскажу об этом некоторое время на этой неделе, так как мне нужно немного украсить структуру и написать некоторую базовую документацию. Если вы снабдите его достаточными «обучающими» данными, он прекрасно узнает языки, я тестировал даже миниатюрные javascripts и языки, которые имеют похожие ключевые слова и структуры, и он никогда не совершал ошибок.

Другой вариант – использовать графическую программу GPL Highlight GUI от Andre Simon, которая доступна для большинства платформ. Он преобразует PHP (и другие языки) в HTML, RTF, XML и т. Д., Которые затем можно вырезать и вставлять на нужную вам страницу. Таким образом, обработка выполняется только один раз.

HTML также основан на CSS, поэтому вы можете изменить стиль по своему усмотрению.

Лично я использую dp.SyntaxHighlighter , но он использует Javascript на стороне клиента, поэтому он не отвечает вашим потребностям. У этого есть хороший плагин Windows Live, хотя я считаю полезным.

Немного поздно, чтобы перезвонить здесь, но я работал над своей собственной библиотекой подсветки синтаксиса PHP. Он все еще находится на ранних стадиях, но я использую его для всех образцов кода в своем блоге.

Просто проверил Hyperlight. Это выглядит довольно круто, но он делает довольно сумасшедшие вещи. Вложенные циклы, обработка строк за строкой и т. Д. Основной класс – более 1000 строк кода.

Если вас интересует что-то простое и легкое, просмотрите Nijikodo: http://www.craigiam.com/nijikodo

Почему бы не использовать ярлык синтаксиса синтаксиса PHP?

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

PHP Highlighter от Krijn Hoetmer предоставляет полностью настраиваемый класс PHP для выделения синтаксиса PHP. HTML, который он генерирует, проверяет под строгим doctype и полностью стилизуется с помощью CSS.

PHP Prettify работает отлично до сих пор, и имеет больше настроек, чем highlight_string