it-swarm.com.de

PHP Satzstellung markieren

Ich suche nach einer PHP Syntax-Highlighting-Engine , die angepasst werden kann (dh ich kann meine eigenen Tokenizer für neue Sprachen angeben) und die mehrere Sprachen verarbeiten kann gleichzeitig (dh auf derselben Ausgabeseite). Diese Engine muss gut mit CSS-Klassen zusammenarbeiten, d. H. Sie sollte die Ausgabe durch Einfügen von <span>-Elementen formatieren, die mit class-Attributen versehen sind. Bonuspunkte für ein erweiterbares Schema.

Ich suche nicht nach einem clientseitigen Syntax-Highlighting-Skript (JavaScript).

Bisher stecke ich mit GeSHi fest. Leider versagt GeSHi aus mehreren Gründen. Der Hauptgrund ist, dass die verschiedenen Sprachdateien völlig unterschiedliche, inkonsistente Stile definieren. Ich habe stundenlang versucht, die verschiedenen Sprachdefinitionen auf einen Nenner umzuwandeln. Da die meisten Definitionsdateien jedoch an sich ziemlich schlecht sind, möchte ich endlich wechseln.

Idealerweise hätte ich gerne eine API ähnlich zu CodeRay , Pygments oder dem JavaScript dp.SyntaxHighlighter .

Klärung:

Ich suche nach einer Code-Hervorhebungssoftware, die in PHP geschrieben wurde, nicht for PHP (da ich sie aus PHP heraus verwenden muss).

37
Konrad Rudolph

Da kein vorhandenes Werkzeug meine Bedürfnisse befriedigte, schrieb ich mein eigenes. Siehe da:

Hyperlight

Die Verwendung ist extrem einfach: einfach verwenden

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

um Code hervorzuheben. Das Schreiben neuer Sprachdefinitionen ist ebenfalls relativ einfach - mit regulären Ausdrücken und einer leistungsstarken, aber einfachen Zustandsmaschine. Übrigens habe ich noch need viele Definitionen, also fühle mich frei, dazu beizutragen.

48
Konrad Rudolph

[Ich habe diese Antwort als Community Wiki markiert, weil Sie speziell nicht nach Javascript suchen.]

http://softwaremaniacs.org/soft/highlight/ist eine PHP (plus die folgende Liste anderer unterstützter Sprachen), die die Bibliothek zur Syntaxhervorhebung enthält :

Python, Ruby, Perl, PHP, XML, HTML, CSS, Django, Javascript, VBScript, Delphi, Java, C++, C #, LISP, RenderMan (RSL und RIB), eingebettete Maya-Sprache, SQL, Smalltalk, Axapta, 1C, Ini, Diff, DOS .bat, Bash

Es verwendet <span class = "stichwort"> style markup.

Es wurde auch in das dojo-Toolkit integriert (als Dojox-Projekt: dojox.lang.highlight )

Javascript ist zwar nicht der beliebteste Weg, einen Webserver zu betreiben, ist aber nicht nur auf der Clientseite implementiert, sondern es gibt auch Server-Side-Javascript-Engine/Plattform-Kombinationen .

10
micahwittman

Ich habe diesen einfachen generischen Syntax-Highlighter in PHP hier gefunden und etwas modifiziert:

<?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;
    }
}

?>

Demo: http://phpfiddle.org/lite/code/1sf-htn


Aktualisieren

Ich habe gerade einen PHP Port meines eigenen generischen JavaScript-Syntax-Highlighter hier erstellt → https://github.com/tovic/generic-syntax-highlighter/blob/master/generic-syntax-highlighter.php

Wie benutzt man:

<?php require 'generic-syntax-highlighter.php'; ?>
<pre><code><?php echo SH('&lt;div class="foo"&gt;&lt;/div&gt;'); ?></code></pre>
9

Es könnte sich lohnen, Pear_TextHighlighter ( documentation ) anzusehen.

Ich denke, es wird nicht standardmäßig html genau nach Ihren Wünschen ausgegeben, aber es bietet umfangreiche Anpassungsmöglichkeiten (d. H. Sie können verschiedene Renderer/Parser erstellen).

3
Tom Haigh

Ich hatte genau das gleiche Problem, aber da ich sehr wenig Zeit hatte und eine wirklich gute Codeabdeckung benötigte, entschied ich mich, einen PHP Wrapper um Pygments Bibliothek zu schreiben.

Es heißt PHPygementizator . Es ist wirklich einfach zu bedienen. Ich habe ein sehr einfaches Handbuch geschrieben. Da PHP in erster Linie die Sprache für die Webentwicklung ist, habe ich die Struktur dieser Tatsache untergeordnet und es sehr einfach gemacht, sie in fast jede Art von Website zu implementieren.

Es unterstützt Konfigurationsdateien und wenn dies nicht ausreicht und jemand etwas ändern muss, löst es auch Ereignisse aus.

Eine Demo der Funktionsweise finden Sie in jedem Post meines Blogs, der Quellcode enthält, zum Beispiel in diesem .

In der Standardkonfiguration können Sie einfach eine Zeichenfolge in diesem Format bereitstellen:

Any text here.

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

Any text.

So wird Code zwischen Tags hervorgehoben (Tags können in der Konfigurationsdatei angepasst werden) und der Rest bleibt unberührt.

Zusätzlich habe ich bereits eine Syntaxerkennungsbibliothek erstellt (verwendet einen Algorithmus, der wahrscheinlich als Bayes'sche Wahrscheinlichkeit klassifiziert wird), die automatisch erkennt, in welchen Sprachcodeblock geschrieben wurde und kann einfach mit einem PHPygementizator -Ereignis verknüpft werden, um eine automatische Spracherkennung zu ermöglichen. Ich werde es wahrscheinlich diese Woche veröffentlichen, da ich die Struktur ein wenig verschönern und einige grundlegende Dokumentationen schreiben muss. Wenn Sie es mit genügend "Lern" -Daten versorgen, erkennt es Sprachen erstaunlich gut. Ich habe sogar minimierte Java-Skripte und Sprachen mit ähnlichen Schlüsselwörtern und Strukturen getestet und es hat nie einen Fehler gemacht.

2
user2742648

Warum nicht den eingebauten Syntax-Highlighter von PHP verwenden?

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

1
Gabor de Mooij

Etwas spät dran, aber ich habe an meiner eigenen PHP Syntax-Highlighting-Bibliothek gearbeitet. Es ist noch am Anfang, aber ich verwende es für alle Codebeispiele in meinem Blog.

Ich habe gerade Hyperlight ausgecheckt. Es sieht ziemlich cool aus, macht aber ziemlich verrücktes Zeug. Verschachtelte Schleifen, zeilenweise Verarbeitung usw. Die Kernklasse umfasst über 1000 Codezeilen. 

Wenn Sie an etwas Einfachem und Leichtem interessiert sind, besuchen Sie Nijikodo: http://www.craigiam.com/nijikodo

1
Craig

Eine andere Option ist die Verwendung des GPLHighlight GUI- Programms von Andre Simon, das für die meisten Plattformen verfügbar ist. Es konvertiert PHP (und andere Sprachen) in HTML, RTF, XML usw., die Sie dann ausschneiden und in die gewünschte Seite einfügen können. Auf diese Weise wird die Verarbeitung nur einmal durchgeführt.

Der HTML-Code ist auch CSS-basiert, sodass Sie den Stil nach Belieben ändern können.

Ich persönlich benutzedp.SyntaxHighlighter, aber das verwendet clientseitiges Javascript, damit es nicht Ihren Anforderungen entspricht. Es hat zwar ein Nice Windows Live Plugin, das ich jedoch als nützlich empfinde.

1
Rob Prouse

Krijn Hoetmers PHP Highlighter bietet eine vollständig anpassbare PHP-Klasse zur Hervorhebung der PHP-Syntax. Der erzeugte HTML-Code wird unter einem strengen Doctype validiert und kann mit CSS vollständig gestylt werden.

0
Mathias Bynens

PHP Prettify Funktioniert soweit gut und hat mehr Anpassungsmöglichkeiten als highlight_string

0
Chrys Ugwu