Syntaxhighlighter will nicht so recht
-
Ich wollte einen Syntaxhighlighter schreiben, der geht allerdings gar nicht.
Hier mal der Code:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>New document</title> <meta name="generator" content="TSW WebCoder"> </head> <link rel="stylesheet" href="Style.css" /> <body> ... <?php $content = "<code> #include <iostream> using namespace std; int main() { cout << \"Hello World\" << endl; return 0; } </code>"; $keywords = array("float", "int", "double", "long", "short", "unsigned", "signed", "void", "new", "delete", "static_cast", "dynamic_cast", "virtual", "inline", "extern", "class", "struct", "for", "while", "do", "if", "this", "return", "operator", "const_cast", "reinterpret_cast", "public", "protected", "private", "const", "volatile", "static", "throw", "catch", "template", "typedef", "typename", "enum", "friend", "bool", "char", "signed", "typeid", "namespace", "break", "continue", "switch", "case", "else", "else if", "explicit", "export", "true", "false", "and", "or_eq", "and_eq", "using", "not", "bitand", "not_eq", "wchar_t", "bitor", "xor", "mutable", "or", "xor_eq","default", "goto", "auto", "union", "register", "compl"); foreach($keywords as $key) { $content = preg_replace("/".$key."/", "<div class=\"keyword\">".$key."</div>", $content); } echo $content; ?> <br /><br /> ... </body> </html>
1. Ich musste den Text außerhalb des Code Bereichs aus dem String raußschmeißen, kann man es auch so einstellen, dass nur in <code> Abschnitten gesucht wird?
2. Das kommt dan raus:
#include ord">using ord">namespace std; ord">class="keyword">int main() { cout << "Hello World" << endl; ord">return 0; }
Wie bekomm ich diese Fehler weg und welche sind noch drinnen?
-
Glamdrink schrieb:
Ich wollte einen Syntaxhighlighter schreiben, der geht allerdings gar nicht.
aber meiner geht.
http://www.volkard.de/Software/Clientsided Syntax-Highligter/edit: ups, du benutzt a php. dann hilft dir meiner nix.
-
- verwende str_replace
- mit preg_match kannst du den Inhalt von <code>-Tags auslesen - alternativ und vermutlich besser geht es mit strpos und substr
- dein Highlighter ist Fehlerhaft: denn ein keyword ist nicht immer keyword. zB wenn es in einem string steht oder nur ein Teil eines Wortes ist - dann darf es nicht gehighlightet werden.
schau dir mal http://www.beautifier.org/ an
-
Noch mehr Probleme:
- Dein Ersetzungsstring beinhaltet selbst wieder Schlüsselwörter (z.B. 'class') damit machst du dir dann alles kaputt.
Ein lösung mit PREGS wäre etwas wie
$preg = '~[^A-Za-z_0-9]+(' . implode('|', $keywords) . ')[^A-Za-z_0-9]+~i'; $content = preg_replace($preg, '<div class="...">\\1</div>', $content);
Dann brauchst du auch kein foreach. Gebe jetzt aber keine Garantie für's Funktionieren. Nur der Grundgedanke sollte dir klar sein.
@Shade of Nine: Bei 2) Kann ich dir absolut nicht zustimmen. Für solche Aufgaben sind pregs wie geschaffen. Solange es nicht in irgendwelche kontextsensitiven und verschachtelten Ebenen geht. Und 1) bringt nichts - siehe mein 4). :p