PHP hat eine coole Funktion, die PHP-Code automatisch hervorhebt und sich highlight_string(); nennt. Theoretisch könnte man damit auch eigenen Code auf einer Website hervorheben, anstatt sich auf JavaScript oder irgendeinen externen Dienst zu verlassen. In diesem Artikel zeige ich die Grundlagen, wie es funktioniert, und erweitere es dann mit ein paar Tricks. Da JavaScript in der Syntax PHP sehr ähnlich ist, können wir die Funktion austricksen, um auch JavaScript-Code hervorzuheben. Und schließlich zeige ich, wie wir mit etwas Intelligenz den Code automatisch einrücken können.
Besonderer Dank geht an Benjamin Mayo (Darren Beige), der die format_javascript() Funktion geschrieben hat, die wir uns unten ansehen werden.
Grundlegende Verwendung
Die Funktion highlight_string() akzeptiert nur einen String, der mit <?php beginnen und mit ?> enden muss. Standardmäßig gibt sie die Zeile aus.
<?php highlight_string('<?php
$i = 1;
function rockOut() {
alert("wah wah wah");
}
?>'); ?>
Der resultierende HTML-Code lautet
<pre id="code_highlighted"><code><span style="color: #0000BB">
<span style="color: #0000BB"><script type="text/javascript">
</span><span style="color: #007700">if (</span><span style="color: #0000BB">true</span><span style="color: #007700">) {
echo </span><span style="color: #DD0000">'The value is true'</span><span style="color: #007700">;
} else {
echo </span><span style="color: #DD0000">'The value is false'</span><span style="color: #007700">;
}
</span><span style="color: #0000BB"></script></span>
</span>
Und das sieht dann so aus
Ziemlich wild, oder? Wenn Sie möchten, dass der String zurückgegeben und nicht ausgegeben wird, übergeben Sie einfach TRUE als zweiten Parameter.
Austricksen, um JavaScript hervorzuheben
Benjamin Mayo (Darren Beige) hat eine PHP-Funktion entwickelt, die PHP dazu bringt, JavaScript-Code anstelle von ausschließlich PHP hervorzuheben. **Darüber hinaus** wendet sie auch eine korrekte Einrückung des Codes an, unabhängig davon, was in der Datei steht. Selbst wenn der ursprüngliche Code beispielsweise komplett linksbündig war wie dieser, wird die Ausgabe schön eingerückt sein.
Schauen Sie sich die Demo an, um es in Aktion zu sehen
Demo ansehen Dateien herunterladen
Wie es funktioniert
Die Einrückung erfolgt durch Hinzufügen von Zeilenumbrüchen nach jeder geschweiften Klammer und jedem Semikolon, falls diese nicht bereits vorhanden sind. Dies platziert jede Anweisung auf eine eigene Zeile und bereitet den Code vor. Der Hauptteil des Codes für die Einrückung geschieht jedoch in der Schleife selbst.
$lineecho = $line;
if (substr_count($line, "\t") != $tab) {
$lineecho = str_replace("\t", "", trim($lineecho));
$lineecho = str_repeat("\t", $tab) . $lineecho;
}
$tab = $tab + substr_count($line, "{") - substr_count($line, "}");
Der Block funktioniert, indem er eine Zählung (in der Variablen $tab) der Anzahl von Tabulatorzeichen ("\t") in der vorherigen Zeile beibehält. Die aktuelle Zeile wird mit der Funktion substr_count() auf Tabs überprüft. Wenn die beiden Werte nicht übereinstimmen, wird die ausgegebene Zeile mit dem $tab-Wert aufgefüllt. Das bedeutet nun, dass die Anzahl der Tabulatorzeichen am Anfang der Zeile mit der Anzahl in der $tab-Variablen übereinstimmt. Nach diesem Verfahren wird der neue $tab-Wert berechnet, indem der aktuelle $tab-Wert genommen und die Anzahl der gefundenen öffnenden Klammern hinzuaddiert und die Anzahl der schließenden Klammern abgezogen wird.
Der Ausgabecode befindet sich in <pre>-Tags, damit die Tabs korrekt angezeigt werden.
Verwendung
Nehmen wir an, Sie möchten einen großen JavaScript-Code-Block hervorheben, der in einer Datei liegt. Ganz einfach, schließen Sie einfach die PHP-Datei/Funktion ein, holen Sie sich den Inhalt dieser Datei und führen Sie die Funktion darauf aus.
<?php
include_once('format_javascript.php');
$BigJavaScriptString = file_get_contents('path/to/javascript.js');
echo format_javascript($testBigJS);
?>
Das Problem hierbei ist, dass Sie den Code in eine String-Variable bekommen müssen, wenn Sie ihn auf diese Weise hervorheben möchten. Wenn Sie dies beispielsweise in einem CMS verwenden möchten, müssten Sie PHP in den gespeicherten Inhaltsbereichen speichern und ausführen können. Oder Sie müssten etwas ausgefallene Regex-Sachen schreiben, um Inhalte zu parsen, nach bestimmten Tags zu suchen und die Inneren in eine Variable zur Hervorhebung zu extrahieren. Über meinen Kopf hinweg.
Wenn Sie daran interessiert sind, wie Sie dies zum Hervorheben anderer Sprachen verwenden könnten, schauen Sie sich den Kommentarthread in der Dokumentation an, der einige Versuche zur Hervorhebung von XML und HTML enthält.
Wow, vielen Dank Chris, guter Tipp
Tolles Tutorial….
Kannst du mir übrigens sagen, wie die Syntax-hervorgehobenen Codes für diese Seite generiert werden…
http://tr.im/OKyn
Es ist eine Blogger-Seite…
Wieder ohne JavaScript… aber mit Span-Tags mit Style-Attribut.
Ich schätze, es wurde von einem Tool generiert…
Das ist in Blogspot integriert.
Aber wenn es um unterschiedliche Stile geht, beachten Sie, dass format_javascript() Ihnen erlaubt, die Farben für die Hervorhebung festzulegen. Dies wird in der Datei format_javascript.php erklärt.
Ich glaube nicht…
Ich denke, wenn Sie keine Farbformatierung benötigen, müssen wir die Funktion format_javascript() nicht verwenden. Wenn Sie einen JS-Code hervorheben möchten, verwenden Sie ihn einfach so:
highlight_string(”);
Das funktioniert für mich gut.
PS: Ich benutze das für meinen Blog.
Mhh, ich kann die Datei nicht herunterladen und wo ist die format_javascript() Funktion? Bin ich blind?
Der Download-Link sollte jetzt funktionieren.
Die Funktion format_javascript() befindet sich in der Datei format_javascript.php. Binden Sie sie einfach in Ihre Skripte ein und rufen Sie die Funktion wie im Beitrag gezeigt auf.
Super. Nützliche Funktion.
Gibt es eine Möglichkeit, Zeilennummern hinzuzufügen?
Ja.
Ändern
foreach ($data as $line) {
zu
foreach ($data as $num => $line) {
$output .= ''.$num.'';
Sie können die Ausgabe beliebig ändern.
Warum das Rad neu erfinden? http://alexgorbatchev.com/wiki/SyntaxHighlighter
Kann keine Einrückung.
Doch, das kann es.
Download-Button funktioniert nicht ;-
Danke für den Hinweis. Behoben.
Warum nicht http://qbnz.com/highlighter/ verwenden? Ich benutze selbst Pygments, aber das ist Python, nicht PHP.
Keine Einrückung und außerdem wird es schneller sein als das, da es hauptsächlich auf einer nativen Funktion basiert.
GeSHi kann Einrückung. Sie müssen wahrscheinlich nur "white-space: pre" darauf anwenden.
Können Sie mir ein Beispiel zeigen?
Ich habe die Dokumentation geprüft und die einzige Erwähnung von Einrückung bezieht sich darauf, wie sie die Einrückung beibehält, wenn Code in DIVs angezeigt wird.
Noch ein Punkt für PHP!
Benjamin – Mach weiter so, und viel Erfolg bei deinen Unternehmungen!
Danke. Ich brauche wirklich einen dedizierten Tech-Blog.
Was bedeutet "god speed"?
Übrigens, ich liebe Ihren Cube-Scroller auf Ihrer Website. Wenn das eines Tages in JS gemacht werden kann, wird es episch.
Ausgeposteter Beitrag & Tutorial.
Danke!
Interessant. Obwohl der generierte Markup etwas hässlich ist.
Es wäre interessant zu sehen, ob man ihn dazu bringen kann, CSS-Klassen zu verwenden.
PHP bietet zwei Funktionen zum Hervorheben von PHP-Code: highlight_file() … beim Hervorheben von Code anderer Programmiersprachen, wie HTML oder JavaScript.
highlight_file() ist immer noch nur ein PHP-Parser.
Schöner Trick, sehr nützlich. Danke!
Das ist nett, aber es wäre schön, wenn man den
style="color: #0000BB"durch etwas wieclass="identifier"oder Ähnliches ersetzen könnte.Es scheint, dass das Blau für verschiedene Dinge verwendet wird (Literale, Variablen usw.), daher würde dieser Ansatz wahrscheinlich nicht die notwendige Granularität bieten. Gut für eine schnelle und schmutzige Lösung.
Für mehr gibt es in PHP auch highlight_file()
Danke dafür; das ist wirklich cool, das ist das erste Mal, dass ich eine großartige Lösung habe, bevor ich das gelesen habe, habe ich PHP-Code mit CSS-Farben eingefärbt… also nochmals vielen Dank dafür
Danke für das Skript!
Ich habe gerade die Funktion highlight_string() kennengelernt. Wahrscheinlich hätte ich sie nie kennengelernt, wenn ich Ihren Beitrag nicht gelesen hätte. Danke.
Danke dafür, es ist der beste Artikel
Ausgezeichnet. Funktioniert wie ein Zauber.. Danke!
Ausgezeichneter Code!
Ich bin ein Anfänger-Programmierer und habe gerade highlight_string() entdeckt, was mich wirklich begeistert hat – dann habe ich das hier entdeckt, was meine Welt komplett auf den Kopf gestellt hat!
Wird definitiv in meinen Blog integriert, wenn ich mit dem Redesign beginne!
Danke!!