Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] RegExp für Syntax Highlighter

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] RegExp für Syntax Highlighter

    Ich arbeite an einen Syntax Highlighter, dieser soll alle möglichen Programmiersprachen highlighten, dennoch arbeite ich gerade nur an einer C++ Version. Andere Programmiersprachen möchte ich später hinzufügen. Aber ich möchte hier nicht um den heißen Brei herum reden, sondern euch schildern, wo es hackt.

    Und zwar möchte ich diesen C++ Code "matchen":

    Code:
    #include <iostream>
    #include <string>
    #include "foobar.h"
    
    #define PRINT_CHEESE printf( \
        "I like %d types of cheese\n", \
        5 \
    )
    mithilfe diesen Codes

    PHP-Code:
    $code htmlspecialchars(trim($code));
    preg_match_all("/#(?:\\\\\\\\|\\\\\r\n|.)*$/m"$code$matches);
            
    print_r($matches); 
    Dies klappt auch wunderbar aber auch nur solange ich das Escape Zeichen (\n, dick hervorgehoben im Code) wegnehme, lass ich es an der Stelle schneidet, der dass einfach ab.


    Ausgabe: Ohne \n im C++ - Code
    Code:
    Array
    (
        [0] => Array
            (
                [0] => #include &lt;iostream&gt;
                [1] => #include &lt;string&gt;
                [2] => #include &quot;foobar.h&quot;
                [3] => #define PRINT_CHEESE printf( \
        &quot;I like %d types of cheese&quot;, \
        5 \
    )
            )
    
    )
    Ausgabe: Mit \n im C++ - Code
    Code:
    Array
    (
        [0] => Array
            (
                [0] => #include &lt;iostream&gt;
                [1] => #include &lt;string&gt;
                [2] => #include &quot;foobar.h&quot;
               [3] => #define PRINT_CHEESE printf( \
        &quot;I like %d types of cheese
            )
    
    )
    Frage: Kann ich das irgendwie umgehen bzw. gibt es da irgendein Work-around oder hab ich ein Fehler im regulären Ausdruck?

    Vielen Dank für euer Hilfe


  • #2
    Wenn es auch fertig geht:
    https://de.wikipedia.org/wiki/GeSHi
    Windows Server gehören NICHT ins Internet!

    Dildo? Dildo!

    Kommentar


    • #3
      Ich möchte nicht auf irgendwas fertiges zurückgreifen, ich hab vor mir einen eigenen zu schreiben, nur macht mir dieser eine reguläre Ausdruck zu schaffen . Außerdem hast du dir schon mal den Quellcode von GeShi angeguckt ? Der ist jenseits von gut und böse, total überladen.

      Kommentar


      • #4
        Zitat von Fleischkeule Beitrag anzeigen
        Der ist jenseits von gut und böse, total überladen.
        Und das hier nennst du "schlank" und "nicht überladen"?

        PHP-Code:
        "/#(?:\\\\\\\\|\\\\\r\n|.)*$/m" 
        Schonmal dran gedacht, dass es einen Grund hat, warum Syntax Highlighting so schwer ist? Dass das nicht "überladen" ist, sondern "nötig"?

        Mit Regex brauchste da garnich ankommen - das mag vielleicht für deinen Mini-C++-Code noch klappen, spätestens bei HTML ist dann aber endgültig Schluss.
        Lerne Grundlagen | Schreibe gute Beispiele | PDO > mysqli > mysql | Versuch nicht, das Rad neu zu erfinden | Warum $foo[bar] böse ist | SQL Injections | Hashes sind keine Verschlüsselungen! | Dein E-Mail Regex ist falsch

        Kommentar


        • #5
          Zitat von Fleischkeule Beitrag anzeigen
          Dies klappt auch wunderbar aber auch nur solange ich das Escape Zeichen (\n, dick hervorgehoben im Code) wegnehme, lass ich es an der Stelle schneidet, der dass einfach ab.
          Denk mal scharf nach. Der Ausdruck matcht nach einer # alle Zeichen die kein Zeilenumbruch sind (.), alle Zeilenumbrüche mit einen Backslash davor (\\\\\r\n), und zwei Backslashs hintereinadner (\\\\\\\\). Was schleißen wir daraus?
          1. Zwei Backslashes hintereinander werden werden auch vom Punkt gemacht -> überflüssig
          2. dein \n in $code ist ein Zeilenumbruch und nicht die Zeichenkette \n
          3. da der Ausdruck gready ist kannst du dir das $ sparen und damit auch das m

          Kommentar


          • #6
            Zitat von ApoY2k Beitrag anzeigen
            Mit Regex brauchste da garnich ankommen - das mag vielleicht für deinen Mini-C++-Code noch klappen, spätestens bei HTML ist dann aber endgültig Schluss.
            Warum ? Geshi würde ohne reguläre Ausdrücke auch nicht funktionieren, und warum sollte bei mir mit HTML endgültig Schluss sein? Ich hab auch nicht vor alles mit regulären Ausdrücken zu lösen. Ich möchte nur einen Syntaxhighlighter programmieren, der nicht wie Geshi ~5000+ Zeilen umfasst, da hab ich schon deutlich schlankere Highlighter gesehen.

            Kommentar


            • #7
              Zitat von Fleischkeule Beitrag anzeigen
              da hab ich schon deutlich schlankere Highlighter gesehen.
              Warum verwendest du dann nicht einen von denen? Ich kenne mich damit nicht aus, aber das erinnert mich an die Leute die ihr eigenes PHP Framework schreiben wollen. Obwohl es schon genug Frameworks gibt.

              Soll das einen Lerneffekt haben oder soll der Highlighter besser als alle anderen werden?

              Kommentar


              • #8
                jo, vimnrc files; achso, die deffineiren nur die schlüsselwörter na dann.

                aber mit verlaub, wenn ein "\n" probleme macht, kann so ein tool noch eine haarige sache werden.

                Kommentar


                • #9
                  Nein, der Highlighter soll nicht besser werden als andere. Du hast schon richtig geraten, es soll einfach einen Lerneffekt haben, dennoch verstehe ich nicht wieso er das "\n" nicht mit matcht sondern dort einfach aufhört :/. Die sichtbaren Escape Zeichen sollen ignoriert werden... Achja, ich verwende keinen schlankeren Highlightern, 1. wegen den Lerneffekt und 2. sind die meist in andere Programmiersprachen (z.B JavaScript) programmiert. Ich möchte schon einen Syntaxhighlighter haben der auch ohne JavaScript funktioniert.

                  Kommentar


                  • #10
                    Hab das hier von Wikipedia zum Thema Escape Sequenzen. Ich weiß nicht ob das bei PHP auch zu trifft, aber ich denke schon.

                    Das jeweilige Programm – unabhängig davon, ob es sich um eine Anwendung für Desktoprechner oder ein Steuerprogramm in einem Peripheriegerät handelt – erkennt beim Verarbeiten einer Zeichenfolge, zum Beispiel eines Textes, das Escape-Zeichen, steigt aus der normalen Verarbeitung aus und löst die der folgenden Zeichensequenz zugeordnete Sonderfunktion aus.

                    Kommentar


                    • #11
                      Da bleibt mir wohl nicht anderes übrig als mich dort weiter einzulesen und andere Syntax Highlighter zu studieren, trotzdem Danke.

                      Kommentar


                      • #12
                        Könnte man nicht einfach aus dem \n ein \\n machen?

                        update: hmm irgendwie ergibt das glaub ich keinen Sinn . Aber vielleicht könntest du, gerade bei C++, das Problem mit dem Präprozessor lösen.

                        Kommentar


                        • #13
                          Ja daran hab ich auch schon gedacht und sogar schon umgesetzt, aber irgendwie schneidet der dort trotzdem ab, das Problem scheint also an diesen \ Zeichen zu hängen. Ich werde mich schlau lesen und gegebenenfalls ein Update liefern zu dieser Sache.
                          Danke Fuel

                          Kommentar


                          • #14
                            Ja mit \ wird die Escape Sequenz eingeleitet, deswegen dachte ich zuerst, dass \\n helfen könnte, aber beim kompilieren des Codes hättest du dann auch leider nicht den Zeilenumbruch. Der ja an dieser Stelle gewünscht ist.

                            Kommentar


                            • #15
                              Vielen Dank nochmal Fuel, hast mir echt geholfen, werde wohl öfters mal Wikipedia einen Besuch abstatten, bei solchen Angelegenheiten. Hab heraus gefunden das PHP die Escape Sequenzen immer ausführt, und man die Nowdoc Syntax verwenden sollte oder einfache Anführungszeichen, damit diese Escape Zeichen nicht ausgeführt werden, gilt also nicht nur für Variablen, wieder was neues gelernt.

                              Kommentar

                              Lädt...
                              X