PHP-Code zerlegen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ausdruck
ausgeben
beitrag
bereich
compiler
count
funktion
irgend
keyword
langeweile
nochmal
parsen
schaffen
semikolon
sprache
syntax
trennzeichen
variable
verstehe
zeile
-
Hi,
ich hab hier eine sehr schwiereige Aufgabe (das mein ich ernst).
Wie kann ich z.B. folgenden Code:
php $var = "wert1"; echo $var1;
in den folgenden Array zerlegen:
$a = array( 'php_start' => "<?php" 'variable' => "\$var", 'whitespace' => " \\n", 'string' => "\"wert1\"", 'symbol' => ";", 'whitespace' => "\\n", 'keyword' => "echo", 'whitespace' => " ", 'variable' => "\$var", 'symbol' => ";", 'whitespace' => "\\n", 'php_end' => "?>" );
Ich weiss, es ist fast unm?glich, aber hat jemand evntl. eine Idee?
mfg,
hr
Beitrag ge?ndert am 12.01.2006 23:52 von heavyraptor -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
hm, mit den einzelnen bezeichnungen ist glaube ich unm?glich, ohne ein riesen script zu schreiben.
wenn das array auch nur nummern, also pro zeile, haben muss kannst du das so machen:
$code = "<?php \$var = \"wert1\"; echo \$var; ?>"; $lines = explode("\n", $code);
dann hast du folgendes array:
$lines = array ( '0' => "<?php"; '1' => "\$var = \"wert1\";"; '2' => "echo \$var;"; '3' => "?>"; );
-
Hi!
Wof?r brauchst du das denn?
Ich glaube da ist es einfacher eine andere L?sung zu suchen... Erkl?r einfach mal was du Machen willst... -
Hi,
ich denke nicht, dass es mit explode funktionieren w?rde. Es k?nnte ja auch sein, dass der Code ohne whitespace-zeichen geschrieben ist:
$var="wert1";echo$var1;
Dann wurde es nicht gehen... Ich will eben irgend einen Code zerlegen, auch z.B. einen, der durch einen User hochgeladen wurde. Es w?rde vielleicht mit einem Requl?ren Ausdruck funktionieren, aber das w?re sehr kompliziert.
Jemand eine Idee?
mfg,
hr -
Hi,
klar, ein PHP-parser, das w?r's ;).
Aber ich denke nicht, dass ich es schaffen w?rde, so einen Parser zu schreiben, oder gibt es da irgendwelche funktionien daf?r, wie das auch mit den ini-Dateien mit parse_ini_file m?glich ist?
mfg,
hr -
Hi,
klar, ein PHP-parser, das w?r's ;).
Aber ich denke nicht, dass ich es schaffen w?rde, so einen Parser zu schreiben, oder gibt es da irgendwelche funktionien daf?r, wie das auch mit den ini-Dateien mit parse_ini_file m?glich ist?
mfg,
hr
Sag doch erstmal, was du ?berhaupt machen willst. Denn es gibt mit Sciherheit eine einfachere L?sung...
MfG Lucas -
Hi,
was ich damit will, ist es den Code zu Highlighten, wie mit highlight_string. Jedoch will isch den Code dann auch noch ver?ndern, wenn er geparst wird, deswegen muss ich ihn zerlegen.
mfg,
hr -
wieder ich mit einer doofen frage^^
was wilsch du den genau zerlegen? ansich m?sste es mit ; gehen... (und explod)...
willst du gro? u klein schreibung ?ndern oder was? -
Hi,
@ohost:
Ich will den ganzen Code einfach in jedes einzelne Element zerlegen. Weiter nichts. Aber mit explode geht es ja nicht, wie ich bereits sagte. Zeichen wie ; sind ja in einem PHP-Code nicht einmal n?tig. Und zerlegen ducrh Withespace-Zeichen kann man auch nicht, weil, wie ich schon sagte, whitespace-Zeichen auch unn?tig sind.
Warscheinlich m?sste man Zeichen f?r Zeichen analysieren, sodass man ihn richtig zerlegen kann.
mfg,
hr
-
Einen PHP-Quellcode-Parser zu schreiben, halte ich f?r nicht realisierbar.
Das simple Explode oder regul?re Ausdr?cke reichen hier nicht. Man sollte n?mlich bedenken, dass es in PHP-Quellcode Bereiche gibt, die eine extra Behandlung ben?tigen: HTML-Bereiche, Kommentare, Stringkonstanten. Die alle d?rfen zum Beispiel ";" enthalten, dort hat es aber keine Wirkung. Im PHP-Bereich dagegen schon.
Du hast zwei M?glichkeiten:
1. Benutze highlight_string(), speichere dessen Output in einer Variablen und schaue dir an, welche Ausgaben es produziert. Diese k?nnte man mit regul?ren Ausdr?cken durchaus in ein Array bringen. Es gibt allerdings das Problem, dass manche Code-Bl?cke ?ber mehrere Zeilen gehen. Die mit RegExps zu analysieren, wird schwierig. Die Funktion unterscheidet laut PHP.ini folgende Bereiche: HTML (schwarz), Kommentare (orange), Schl?sselw?rter (gr?n), Stringkonstanten (rot) und diverse andere Zeichen ("default", blau).
2. Du schaust dir den GeSHi an. Der kann den PHP-Code noch etwas feiner zerlegen als highlight_string().
http://qbnz.com/highlighter/
Was auch er nicht kann, sind deine Sonderw?nsche, wie Whitespaces und solche Sachen. Syntax-Highlighter sind auf das Erkennen von Text-Bestandteilen optimiert, die f?r einen Interpreter oder Compiler wichtig sind. Whitespaces geh?ren nicht dazu. In PHP sind die Trennzeichen z.B. das Semikolon und die geschweiften Klammern. Whitespaces ignoriert der Compiler einfach.
===
Ich kann die Aufforderung der anderen nur wiederholen: Sag mal etwas konkreter, was du eigentlich vorhast, dann kann man dir besser helfen.
Ich verspreche auch hoch und heilig, dir deine Idee nicht zu klauen und f?r mich selbst zu verwenden! -
Hi,
@alopex: danke f?r deine Vorschl?ge. Dieser GeShi Highlighter ist ja echt interessant. Ich verstehe jedoch nicht, wie das dort gemacht wird. Ich hab da auch im FAQ gelesen, aber da steht nur, dass der Code, so wie ich es will, in einen Array zerlegt wird. Ich hab ihn auch runtergeladen und ein bischen im Code geschn?ffelt, aber hab nichts entscheidendes gefunden.
Ich erkl?r nochmals, was ich will: ich will einen Code-highlighter basteln der PHP, sowie JavaScript, C usw. highlighten kann. Er soll jedoch besser als die highlight_string-Funktion sein (z.B. verbotene Symbole werden auch hervorgehoben und reservierte Keywords oder Funktionen, wie z.b. echo, k?nnen angeklickt werden, die dann zu einer Referenz f?hren). Was vielleicht auch noch wichtig ist, ist dass ich einfach mal einen eigenen Highlighter schreiben wollte, ohne dass ich irgend ein script oder eine Funktion beschafe, die das erledigt.
Ich hab vorhin ?brigens gerade noch eine sehr interessante Funktion entdeckt: token_get_all (http://www.php.net/manual/de/function.token-get-all.php). Diese Funktion zerlegt den PHP-Code in jedes element, wie ich dass will. Das Problem ist aber, dass man ja nur PHP damit zerlegen kann, JavaScript, C usw. geht ja nicht. Also kann ich das nicht benutzen.
Wenn ich aber einen eigenen Parser schreibe, dann habe ich alle M?glichkeiten und k?nnte damit jede Sprache highlighten.
mfg,
hr -
Den Kern von GeSHi verstehe ich auch nicht, aber er besitzt f?r jede Sprache eine spezielle Datei, die die Regeln festlegt, wie was eingef?rbt wird. Wenn du wei?t, wie die Schl?sselw?rter eingef?rbt werden, kannst du diese Einf?rbung ja durch einen HTML-Link ersetzen. Ich hab mir die Ausgaben von GeSHi noch nicht genau angesehen, aber nehmen wir mal an, er baut um ein Schl?sselwort sowas herum:
<span class="keyword">foreach</span>
Dann k?nntest du mit Regul?ren Ausdr?cken, das hier draus bauen:
<a href="http://de.php.net/manual/de/control-structures.foreach.php" class="keyword">foreach</a>
Der regul?re Ausdruck k?nnte so eingebaut werden:
$vorher = preg_quote('<span class="keyword">', '/');
$vorher = preg_quote('</span>', '/');
preg_match('/('.$vorher.')([^<]+)('.$nachher.')/', $quelltext, $rx_matches);
Mit print_r($rx_matches) kannst du dir den Erfolg anschauen:
...
[1] => <span class="keyword">
[2] => foreach
[3] => </span>
...
M?sste ungef?hr so gehen (wie immer ungetestet).
-
Hi,
stimmt, mit einem regul?ren Ausdruck k?nnte man man die Links zur Refernz einbauen.
Ich hab da im code von GeShi nochmals geschaut, aber hab wirklich nichts gefunden (???). Wenn man so einen Parser hat, dann w?re das mit den regul?ren Ausdr?cken auch nicht n?tig, weil man das ja da schon machen kann.
Ich hab da jedoch bei den Dateien von GeShi, wie du gesagt hast, die Dateien gefunden, die die Informationen der Sprachen enthalten. Es ist einfach ein array mit allen Daten der Sprache (alle keywords, symbole usw.). Das heisst also, dass es eine Funktion eben muss, der man diese Information ?bergibt und die das dann so wie gewunscht zerlegt und dann highlighted.
Mich nimmt wunder: wie funktioniert so ein Parser? Zerlegt er den Code in jedes Zeichen, so dass er dann durch wieder zusammensezen keywors erkennt?
mfg,
hr -
Hi,
ich habe auch mal aus langeweile einen PHP Code highlighter Geschrieben, funktioniert ganz gut, aber nicht perfekt... wer es sich anschauen will schau unter:
http://www.criminalfights.de/codeparser/parse_phpcode.php
(Das ist NICHT der Code vom Parse, sondern ein anderes PHP Document, welches vom Parse gehighlighted wurde).
Allerdings ist der Highlighter noch nicht ganz ausgereift, gibt noch einige Codeteile die er nicht richtig parst.
mfG -
Hi,
wie machst du das? Hast den ein eigenen Parser geschrieben oder verwendest du token_get_all?
Nimmt mich wunder, k?nntest du ein Code posten?
Ich will nur mal sehen, wie das geht, ich klau nicht deine Idee.
mfg,
hr
Beitrag ge?ndert am 15.01.2006 13:13 von heavyraptor -
Hi,
der Code ist nicht ausgereift und es gibt PHP Documente welche Falsch gehighlighted werden und dadurch evtl der Code auch falsch ausgegeben wird. Das ganze ist ganz Simpel mit preg_replace(); gel?st, den Code kannst du gerne verbessern und ver?ndern, hier ist er:
<html> <head> <style type="text/css"> a:link, a:visited { text-decoration:underlined; color:#000000; font-weight:bold; } a:hover { text-decoration:underlined; color:#000000; font-weight:bold; background-color:#FFFFCC; } </style> <body> <?php $func[] = 'echo'; $func[] = 'explode'; $func[] = 'list'; $func[] = 'microtime'; $func[] = 'str_replace'; $func[] = 'for'; $func[] = 'round'; $func[] = 'count'; $func[] = 'preg_replace'; $func[] = 'strip_tags'; $func[] = 'function'; $func[] = 'file'; $func[] = 'implode'; $phpcode = file('test18.php'); $phpcode = implode($phpcode); $ausg = $phpcode; $ausg = htmlspecialchars($ausg); $ausg = str_replace(" ", " ", $ausg); $ausg = preg_replace('#^(<\?php|<\?|\?>)#smi', '<span style="color:#FF9900;font-weight:bold">\\1</span>', $ausg); $ausg = preg_replace('#[/]{2}(.*?)$#smi', '<span style="color:#999999;font-style:italic">//\\1</span>', $ausg); $ausg = preg_replace('#(\/\*)#smi', '<span style="color:#999999;font-style:italic">\\1', $ausg); $ausg = preg_replace('#(\*\/)#smi', '\\1</span>', $ausg); $ausg = preg_replace("#(\"|')(.*?)(\\1)#smi", '<span style="color:#008000">\\1\\2\\1</span>', $ausg); $ausg = preg_replace('#\$(.*?)(\=|\)|\[|\,|\])#smi', '<span style="color:#0000FF">$\\1</span>\\2', $ausg); //$ausg = preg_replace('#(.*?)[\(](.*?)[\)]#i', '<span style="font-weight:bold">\\1</span>(\\2)', $ausg); for($i=0;$i<=(count($func)-1);$i++) { $tfunc = str_replace('_', '-', $func[$i]); $ausg = preg_replace('#[^/\'"](' . $func[$i] . ')#si', '<a href="http://www.php.net/manual/function.' . $tfunc . '.php" target="_blank"><span style="font-weight:bold">\\1</span></a>', $ausg); } $ret .= $ausg; $ret = nl2br($ret); echo '<span style="color:#000000;font-family:Courier;font-size:12px">' . $ret . '</span>'; ?>
-
Hi,
ich hab den Code mal ausprobiert, du hast recht, er hat noch probleme. Das problem ist, dass die HTML-tags des Higlighten dann auch als Code erkannt werden, was dann zu einem Durcheinander f?hrt.
Ich denke ich muss mir ein parser schreiben, denn da hab ich alle m?glichkeiten.
Oder hat noch jemand weitere ideen?
mfg,
hr -
Hi,
mit HTML Code hab ich es noch nicht ausprobiert, dass sollte aber kein problem sein...
Das Problem ist, das die RegExp?s noch nicht ausgereift sind, es war auch mehr so aus Langeweile mal nebenher gebastelt... Ich hab eigendlich Null Verwendungszweck daf?r ;)... wenn ich Zeit habe arbeite ich mal weiter Daran evtl schreibe ich auch eine Klasse, welche dann auch HTML, Perl, C++/C, Visual Basic und Co Parsen kann ;)....
mfG -
Hi,
ja, die Regul?ren Ausdr?cke m?sstest du noch verbessern. Wenn du aber ein highlighter f?r php, c usw. basteln willst, dann musst du doch ein Parser schreiben, oder? Das ist echt kompliziert, denn ich versuche es gerade, und komme fast nicht vorw?rts.
mfg,
hr -
Ach quatsch, du musst nur mit Regul?ren Ausdr?cken arbeiten wie ich auch f?r den PHP Code, wenn die RegExp?s verbessert sind w?rde der Code auch komplett richtig gehighlighted werden. Genau so w?rde es auch f?r C++ Laufen, du musst nicht zeichen f?r Zeichen durchgehen und den Code Parsen einfach bisschen in einem C++ Compiler rumgucken wie dieser Highlightet und das dann in Regul?re Ausr?cke ?bersetzen, dass ist alles ;)...
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage