Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
28.06.2003, 21:05
the_viking



Ich wollte in php wohl gerne nen highlighter für c/c++-code machen!

Allerdings fängts schon bei den Kommentaren an:
Wie kann ich z.B.
// Kommentar
(also eine linie) grün einfärben bzw
/*
Ein
Kommentar
/*
(mehrzeilig) ?

ich habs mal mit
ereg_replace("/\\*(.*)\\*/","<font color=\"#008800\">\\0</font>",$code);
versucht, allerdings färbt er dann alles zw. dem ersten /* und dem allerletzen */ ein... ich hab ka wie ich das unterbinden soll...

Wisst ihr vielleicht, wie man das am besten lösen kann?

--

thx, cu, MfG the_viking

(( My =]=H=O=M=E=> Page! ))
Coder bei Brainshock-Interactive und bei Z-Software
My ICQ: #160959446

zum Seitenanfang zum Seitenende Profil || Suche
001
28.06.2003, 22:09
Megge



##pre-edit
aus tv-technischen gründen kann ich den post leider nicht zuende bringen, ich hoffe als ideenanreiz genügt er dir
##pre-edit

$code durch str_count durchlaufen lassen und nach /* sowie */ durchsuchen und zählen.
Quellcode:$a = str_count("*/",$code);
$b = str_count("/*",$code);
if ($a != b) { echo "Fehler, c++ newb-script-fehler"; exit; }
for ($i=0,$i!=$a;$i++) {
  $c = str_pos("/*",$code");
  $d = str_pos("*/",$code");
  //edit
  hier einsetzen: <font color=...> vor der stelle $c einsetzen und </font> nach der stelle $d einsetzten (in eine neue variable. anschliessend die zeichen bis $d löschen. et voila, fertig
  }

--


Dieser Beitrag wurde am 28.06.2003 um 22:10 von Megge bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
28.06.2003, 23:04
Zeeke



Ersetz mal das ereg_replace durch preg_replace...

Ciao

--

zum Seitenanfang zum Seitenende Profil || Suche
003
28.06.2003, 23:18
CN



ereg_replace("/\\*(.*)\\*/","<font color=\"#008800\">\\0</font>",$code);

is übrigens nicht ganz richtig
zufall dass es bei den *s funktioniert
machma sowas (oder so ähnlich..kann das nich testen)

$code = preg_replace('/\\\*(.*)\\\*/Us', '<font color="#008800">\1</font>', $code);

--


Dieser Beitrag wurde am 28.06.2003 um 23:26 von CN bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
28.06.2003, 23:28
the_viking



Jo, hab schon gemerkt. Aber da die Kommentar-Striche sowieso andersherum sind ist es egal ;)

@Megge: Jo, so hab ich das jetzt auch mit den einzeiligen Kommentars. Werde es auch nochmal so mit den mehrzeiligen versuchen!

Danke!

--

thx, cu, MfG the_viking

(( My =]=H=O=M=E=> Page! ))
Coder bei Brainshock-Interactive und bei Z-Software
My ICQ: #160959446

zum Seitenanfang zum Seitenende Profil || Suche
005
28.06.2003, 23:45
Megge



wieso einzeilig ? geht auch prima mehrzeilig...notfalls extractest die /n

--

zum Seitenanfang zum Seitenende Profil || Suche
006
29.06.2003, 00:27
CN



hrm ja da hab ich gepennt .. macht man eben aus dem einen \ n /

megge..
wieso sollte man rumh4x0rn wenns PCRE_MULTILINE gibt

--

zum Seitenanfang zum Seitenende Profil || Suche
007
29.06.2003, 03:38
dp
Administrator


Zitat:
Megge postete
Quellcode:$a = str_count("*/",$code);
if ($a != b) { echo "Fehler, c++ newb-script-fehler"; exit; }
$a != b

o_X

--


Dieser Beitrag wurde am 29.06.2003 um 03:38 von Darth Paul bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
29.06.2003, 08:34
Megge



aarr, tippfehler du spasst :)

du, ich code php erst seit nem jahr, und das auch nicht jeden monat, nur so ab und zu ma wieder nach lust und laune, da kann man ned alle befehle im kopf haben :)

--

zum Seitenanfang zum Seitenende Profil || Suche
009
29.06.2003, 11:18
CN



ok ich hab derbst gepennt ;)

so funktionierts

mehrzeilige comments /* .. */
$code = preg_replace('/(\/\*.*\*\/)/Usm', '<font color="#008800">\1</font>', $code);

einzeilige // ...
$code = preg_replace('/(\/\/.*)$/s', '<font color="#008800">\1</font>', $code);

(test)

--


Dieser Beitrag wurde am 29.06.2003 um 11:24 von CN bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
010
29.06.2003, 12:29
Megge



funkt ned...
gib ma ein:Quellcode:test
//test
test
;)

--

zum Seitenanfang zum Seitenende Profil || Suche
011
29.06.2003, 13:55
CN



$code = preg_replace('/(\/\/.*)/', '<font color="#008800">\1</font>', $code);

jetzt schon :P

--

zum Seitenanfang zum Seitenende Profil || Suche
012
29.06.2003, 17:23
theDon



Zitat:
test
//\foo
test
das zweite test gehört mit auskommentiert.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
013
29.06.2003, 17:36
CN



blabla.. ich kann nich auf jede einzelheit angehen :P
sollte eigentlich nurn beispiel für viking sein

--

zum Seitenanfang zum Seitenende Profil || Suche
014
29.06.2003, 18:53
the_viking



Äh... kann mir das mal jemand erklären =D
Also ich mach jetzt ein extrem-fast-through-the-zeichen-parsing um die Comments zu Filtrieren....

Diese Regulären Ausdrücke gehn mir langsam auffen Geist ;)

--

thx, cu, MfG the_viking

(( My =]=H=O=M=E=> Page! ))
Coder bei Brainshock-Interactive und bei Z-Software
My ICQ: #160959446

zum Seitenanfang zum Seitenende Profil || Suche
015
29.06.2003, 21:21
CN



willst du die patterns erklärt haben oder wie?

http://de3.php.net/manual/en/pcre.pattern.modifiers.php
http://de3.php.net/manual/en/pcre.pattern.syntax.php

--

zum Seitenanfang zum Seitenende Profil || Suche
016
29.06.2003, 23:41
hausi



Quellcode:///*
test
*/
geht auch noch nicht richtig...
Aus dem C++ / C Syntax Highlighter des ThWBs:
Quellcode:// Begin extracting =================
    // Comments and strings are extracted before parsing keywords and then
    // reinserted later. I really don't like this, but as it's pretty fast,
    // I left it untouched.
    // block comments
    if(preg_match_all("/\/\*(.*)\*\//Us", $string, $cmts))
    {
        $string = preg_replace("/\/\*(.*)\*\//Us","|%|C|%|",$string);
    }
    // line comments
    if(preg_match_all("/\/\/.*\n/U", $string, $lcmts))
    {
        $string = preg_replace("/\/\/(.*)\n/U", "|%|LC|%|", $string);
    }

--

zum Seitenanfang zum Seitenende Profil || Suche
017
30.06.2003, 12:30
CN



ja gut.. sollte nur n ansatz sein
viking kann das ja erweitern wenn er das brauch

--

zum Seitenanfang zum Seitenende Profil || Suche
018
30.06.2003, 15:24
Chronial



Ihr wisst aber schon, dass alle bisher genannten Methoden nicht korrekt sind?

Weil das hier ist kein kommentar:
Quellcode:string="\\nixmitkommentar";
string2="und /* das hier erst recht nicht */ ";
Also mit einer so simplen regexp kommt man für diese Aufgabe nicht weit.
Das musst du ganz anders machen.
So in etwa:PHP-Quellcode:<?php
while (preg_match('!(.*)('|"|/\\*|\\*/|//|\n)(.*)!',$target,$match)){
   //Und hier dann schauen, was "
offen" ist, und wenn bei den aktuell offenen Dingen das gematchte geöffnet werden kann, das dann einfügen und in der Variable Speichern.
   //Was noch fehlt ist aber die Erkennung von escaped quotes. Das wäre wohl am besten per assertion zu machen.
}
?>

Naja, ist ziemlich komliziert. Solltest du nur machen, wenn du ziemlich gut p-regexp kannst, bzw. sie ziemlich genau lernen willst.

--

"tsuji-giri" (japanisch) - ein neues Schwert an einem Passanten ausprobieren


Dieser Beitrag wurde am 30.06.2003 um 15:33 von Chronial bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
019
30.06.2003, 16:11
CN



string="\\nixmitkommentar";

hat wer was anderes behauptet ;)

ich würd übrigens ?! und ?= verwenden.. aber auch nur wenn du ziehmlich gut p-regexp kannst ( ;P )

--

zum Seitenanfang zum Seitenende Profil || Suche
020
30.06.2003, 17:19
Chronial



"Das wäre wohl am besten per assertion zu machen."
Wer lesen kann ist klar im vorteil - oder wie war das?

Und ja, das hat jemand behauptet. Und zwar alle bisher geposteten Regexps

--

"tsuji-giri" (japanisch) - ein neues Schwert an einem Passanten ausprobieren

zum Seitenanfang zum Seitenende Profil || Suche
021
30.06.2003, 17:53
CN



nein .. ich hab nur behauptet // bla is ein kommentar
isn kleiner unterschied zwischen \\ und //
ich nehme mal an du meintest string = "//bla";
das hab ich nicht berücksichtigt.. sollte aber trotzdem nichts entgültiges sein
wen

um ehrlich zu sein hab ich garnix gelesen.. ich hab mir nur das pattern angeguckt

Zitat:
wen

--

zum Seitenanfang zum Seitenende Profil || Suche