Я ищу Механизм подсветки синтаксиса PHP, который можно настроить (т.е. я могу предоставить свой собственные токенизаторы для новых языков) и который может обрабатывать несколько языков одновременно (т.е. на одной странице вывода). Этот движок должен хорошо работать вместе с CSS классы, т.е. он должен форматировать вывод, вставляя элементы <span>, украшенные атрибутами class. Бонусные баллы за расширяемую схему.
Я выполняю поиск нет сценария подсветки синтаксиса на стороне клиента (JavaScript).
Пока что я застрял с GeSHi. К сожалению, GeSHi терпит неудачу по нескольким причинам. Основная причина в том, что разные языковые файлы определяют совершенно разные несовместимые стили. Я часами пытался преобразовать определения разных языков до общего знаменателя, но поскольку большинство файлов определений сами по себе довольно плохи, я, наконец, хотел бы переключиться.
В идеале я хотел бы иметь API, похожий на CodeRay, Пигменты или JavaScript dp.SyntaxHighlighter.
Я ищу программное обеспечение для подсветки кода, написанное в PHP, а не для PHP (так как мне нужно использовать его изнутри PHP).
Я явно не хотел ограничивать это. Целевые языки не должны иметь значения: любой стоящий механизм подсветки синтаксиса может быть расширен для достаточно хорошей обработки (почти) всех языков. Я не ищу специализированные версии, которые работают только с небольшим подмножеством.
Я написал оболочку PHP для библиотеки Pygments, которая поддерживает тонны языков. Я использовал его на нескольких сайтах, он отлично работает, может быть, кому-нибудь он пригодится: github.com/igorpan/PHPygmentizator






[Я пометил этот ответ как Сообщество вики, потому что вы специально нет ищете Javascript]
http://softwaremaniacs.org/soft/highlight/ - это библиотека подсветки синтаксиса PHP (плюс следующий список поддерживаемых языков):
Python, Ruby, Perl, PHP, XML, HTML, CSS, Django, Javascript, VBScript, Delphi, Java, C++, C#, Lisp, RenderMan (RSL and RIB), Maya Embedded Language, SQL, SmallTalk, Axapta, 1C, Ini, Diff, DOS .bat, Bash
Он использует разметку стиля <span class = "keyword">.
Он также был интегрирован в набор инструментов додзё (как проект dojox: dojox.lang.highlight)
Хотя это и не самый популярный способ запуска веб-сервера, строго говоря, Javascript не только реализован на стороне клиента, но также есть Комбинации движка / платформы Javascript на стороне сервера также.
В функции php по умолчанию есть <? Php highlight_string ('<? Php phpinfo ();?>'); ?> Ссылка: tamildic.com/online-php-syntax-highlighter Рабочий инструмент тестирования
Другой вариант - использовать программу GPL Выделить графический интерфейс Андре Саймона, доступную для большинства платформ. Он конвертирует PHP (и другие языки) в HTML, RTF, XML и т. д., Которые затем можно вырезать и вставить на нужную страницу. Таким образом, обработка выполняется только один раз.
HTML также основан на CSS, поэтому вы можете изменить стиль по своему усмотрению.
Лично я использую dp.SyntaxHighlighter, но он использует Javascript на стороне клиента, поэтому он не соответствует вашим потребностям. У него есть хороший плагин для Windows Live, который я считаю полезным.
Возможно, стоит посмотреть Груша - текстовый выделитель (документация)
Я думаю, что по умолчанию он не будет выводить html именно так, как вы этого хотите, но он предоставляет широкие возможности для настройки (т.е. вы можете создавать разные рендереры / парсеры)
PHP Highlighter Krijn Hoetmer предоставляет полностью настраиваемый класс PHP для выделения синтаксиса PHP. HTML, который он генерирует, проверяет в соответствии со строгим типом документа и полностью совместим с CSS.
Это работает только для PHP, но не для других языков.
Поскольку ни один из существующих инструментов не удовлетворял моим потребностям, я написал свой собственный. И вот:
Использовать очень просто: просто используйте
<?php hyperlight($code, 'php'); ?>
чтобы выделить код. Написание новых определений языка также относительно легко - с использованием регулярных выражений и мощного, но простого конечного автомата. Кстати, у меня по-прежнему много определений необходимость, так что не стесняйтесь вносить свой вклад.
Это мило. Я бы хотел, чтобы он обнаруживал методы / конструкторы, а также типы в объявлениях переменных.
Добавить нетрудно. Престижность! Здесь - это мой универсальный выделитель кода, который разумно обрабатывает многие языки. Протестировано на: Java, C#, JavaScript, AS3, C, C++, Lua.
Немного поздно вмешиваться, но я работал над своей собственной библиотекой подсветки синтаксиса PHP. Он все еще находится на начальной стадии, но я использую его для всех примеров кода в своем блоге.
Только что проверил Hyperlight. Выглядит довольно круто, но делает довольно сумасшедшие вещи. Вложенные циклы, построчная обработка и т. д. Основной класс - это более 1000 строк кода.
Если вас интересует что-то простое и легкое, обратите внимание на Nijikodo: http://www.craigiam.com/nijikodo
«Основной класс - это более 1000 строк кода» Подождите, что? Нет, я бы это знал. Он значительно короче - я просто попытался объединить все основные функции (то есть классы несколько) в один файл, чтобы упростить его распространение. Оглядываясь назад, это ошибка. Кроме того, нет построчной обработки. По сути, это обычный лексический анализатор (только он может обрабатывать рекурсивные определения лексем). - Тем не менее, ваш код тоже выглядит неплохо. Я обязательно посмотрю на это.
Почему бы не использовать встроенную подсветку синтаксиса PHP?
http://php.net/manual/en/function.highlight-string.php
Потому что это, конечно, только подчеркивает код PHP. Кроме того, потому что эта функция отстой, поскольку она вообще не настраивается.
о, вы можете настроить его через настройки ini, например highlight.comment :)
Кроме того, он выводит встроенные стили, а не классы css, что отвратительно и не то, о чем просил OP.
На самом деле у него нет того, что я бы назвал «конфигурацией». Вы можете выбрать цвета. Вот и все. У вас нет контроля над такими вещами, как номера строк, промежутки, выделяемый язык, альтернативные цвета строк, выделенные строки, выделенные подразделы и другие функции, которые являются общими для многих средств выделения синтаксиса.
У меня была точно такая же проблема, но поскольку у меня было очень мало времени и требовалось действительно хорошее покрытие кода, я решил написать PHP-оболочку вокруг библиотеки Пигменты.
Это называется PHPygmentizator. Это действительно просто в использовании. Я написал очень простой руководство по эксплуатации. Поскольку PHP - это в первую очередь язык веб-разработки, я подчинил структуру этому факту и упростил реализацию практически на любом веб-сайте.
Он поддерживает файлы конфигурации, и если этого недостаточно и кому-то нужно изменить что-то в процессе, он также запускает События.
Демонстрацию того, как это работает, можно найти практически в любом посте моего блога, который содержит исходный код этот например.
В конфигурации по умолчанию вы можете просто предоставить ему строку в этом формате:
Any text here.
[pygments=javascript]
var a = function(ar1, ar2) {
return null;
}
[/pygments]
Any text.
Таким образом, он выделяет код между тегами (теги можно настроить в файле конфигурации), а остальное оставляет нетронутым.
Кроме того, я уже сделал распознавание синтаксиса библиотека (он использует алгоритм, который, вероятно, был бы классифицирован как Байесовская вероятность), который автоматически распознает, на каком блоке кода языка написан, и может быть легко привязан к одному из событий PHPygmentizator для обеспечения автоматического распознавания языка. Я, вероятно, сделаю это публично на этой неделе, так как мне нужно немного украсить структуру и написать некоторую базовую документацию. Если вы предоставите ему достаточно "обучающих" данных, он удивительно хорошо распознает языки. Я тестировал даже минифицированные javascript-файлы и языки с похожими ключевыми словами и структурами, и он ни разу не сделал ошибок.
Спасибо, надеюсь, с автоматическим распознаванием языка будет еще лучше. Хотя создание оболочки вокруг Pygments было обоюдоострым клинком: она обеспечивает поддержку огромного количества языков, но не может использоваться на веб-сайтах на виртуальном хостинге.
Я нашел эту простую универсальную подсветку синтаксиса, написанную на 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
Я только что создал порт PHP для моей собственной подсветки синтаксиса JavaScript здесь → 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('<div class = "foo"></div>'); ?></code></pre>
Мне нравится, что он хранит информацию о языке в массиве регулярных выражений. Должно быть легко предоставить разные массивы регулярных выражений для разных языков, если вы хотите получить более конкретную подсветку.
пожалуйста, обновите свой код до php 7
PHP Prettify Пока работает нормально, и имеет больше настроек, чем highlight_string
Но он поддерживает только код PHP, а это не было обязательным требованием.
Было бы полезно, если бы вы указали, на каких языках вам нужна подсветка синтаксиса для работы.