Подсветка синтаксиса PHP

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

Я выполняю поиск нет сценария подсветки синтаксиса на стороне клиента (JavaScript).

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

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

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

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

Было бы полезно, если бы вы указали, на каких языках вам нужна подсветка синтаксиса для работы.

Kibbee 04.05.2009 16:39

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

Konrad Rudolph 04.05.2009 17:12

Я написал оболочку PHP для библиотеки Pygments, которая поддерживает тонны языков. Я использовал его на нескольких сайтах, он отлично работает, может быть, кому-нибудь он пригодится: github.com/igorpan/PHPygmentizator

user2742648 20.02.2013 02:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
38
3
30 118
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

[Я пометил этот ответ как Сообщество вики, потому что вы специально нет ищете 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 Рабочий инструмент тестирования

Manikandan 16.08.2019 14:43

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

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

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

Возможно, стоит посмотреть Груша - текстовый выделитель (документация)

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

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

Это работает только для PHP, но не для других языков.

Konrad Rudolph 02.05.2009 17:38
Ответ принят как подходящий

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

Гиперсвет

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

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

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

Это мило. Я бы хотел, чтобы он обнаруживал методы / конструкторы, а также типы в объявлениях переменных.

NateS 30.05.2014 14:29

Добавить нетрудно. Престижность! Здесь - это мой универсальный выделитель кода, который разумно обрабатывает многие языки. Протестировано на: Java, C#, JavaScript, AS3, C, C++, Lua.

NateS 30.05.2014 15:23

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

Только что проверил Hyperlight. Выглядит довольно круто, но делает довольно сумасшедшие вещи. Вложенные циклы, построчная обработка и т. д. Основной класс - это более 1000 строк кода.

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

«Основной класс - это более 1000 строк кода» Подождите, что? Нет, я бы это знал. Он значительно короче - я просто попытался объединить все основные функции (то есть классы несколько) в один файл, чтобы упростить его распространение. Оглядываясь назад, это ошибка. Кроме того, нет построчной обработки. По сути, это обычный лексический анализатор (только он может обрабатывать рекурсивные определения лексем). - Тем не менее, ваш код тоже выглядит неплохо. Я обязательно посмотрю на это.

Konrad Rudolph 16.08.2010 11:54

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

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

Потому что это, конечно, только подчеркивает код PHP. Кроме того, потому что эта функция отстой, поскольку она вообще не настраивается.

Konrad Rudolph 15.06.2011 18:04

о, вы можете настроить его через настройки ini, например highlight.comment :)

cweiske 07.11.2013 00:31

Кроме того, он выводит встроенные стили, а не классы css, что отвратительно и не то, о чем просил OP.

Tom Auger 23.01.2015 18:41

На самом деле у него нет того, что я бы назвал «конфигурацией». Вы можете выбрать цвета. Вот и все. У вас нет контроля над такими вещами, как номера строк, промежутки, выделяемый язык, альтернативные цвета строк, выделенные строки, выделенные подразделы и другие функции, которые являются общими для многих средств выделения синтаксиса.

Bob Ray 05.12.2017 08:31

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

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

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

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

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

Any text here.

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

Any text.

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

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

Спасибо, надеюсь, с автоматическим распознаванием языка будет еще лучше. Хотя создание оболочки вокруг Pygments было обоюдоострым клинком: она обеспечивает поддержку огромного количества языков, но не может использоваться на веб-сайтах на виртуальном хостинге.

user2742648 20.02.2013 07:02

Я нашел эту простую универсальную подсветку синтаксиса, написанную на 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


Обновлять

Я только что создал порт 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('&lt;div class = "foo"&gt;&lt;/div&gt;'); ?></code></pre>

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

spike.barnett 20.05.2016 11:05

пожалуйста, обновите свой код до php 7

Manojkiran.A 11.02.2019 11:00

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

Но он поддерживает только код PHP, а это не было обязательным требованием.

Konrad Rudolph 07.11.2016 20:53

Другие вопросы по теме