Pekka sucht Regex!

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

  • Pekka sucht Regex!

    In Reguläre Ausdrücke komme ich trotz aller Versuche nicht ordentlich rein. Hat jemand, der sie im Schlaf beherrscht, Lust, mir folgende Aufgabenstellung in einen Regex zu gießen? Wäre sehr dankbar.

    Finde aus einem String das erste Vorkommen eines Blocks, der mit

    /**

    beginnt und mit

    */

    endet (ein phpDocumentor-Docblock).
    Schneide daraus heraus alles zwischen der Zeichenkette "@desc" und dem nächsten Vorkommen von "@".

    Also verbildlicht:

    Code:
     /**
      * @desc Dies ist der Teil, den ich per Regex rausschneiden will
      *             und dies
      *             und dies
      * @author dies nicht mehr.
      * @copyright und dies auch nicht.
     */
    
     /**
      * @desc und dies auch nicht, weil es im zweiten Docblock ist. 
      */

  • #2
    Hm, das, was im DocBlock steht, zu matchen ist nicht weiter schwierig:
    Code:
    /\*.*?@desc([^@]+).*?\*/
    (auch wenn der Ausdruck sicherlich keinen Preis gewinnen würde).

    Ich habe gerade leider keine Zeit, mit Lookaround zu hantieren, aber vielleicht komme ich morgen oder die Tage dazu. Alternativ könntest du natürlich auch außerhalb des Regulären Ausdrucks ermitteln, ob es sich um das erste Vorkommen eines DocBlock handelt.


    Grüße
    Zuletzt geändert von Griecherus; 29.11.2008, 20:57.
    Nieder mit der Camel Case-Konvention

    Kommentar


    • #3
      Das ist schon ein guter Ansatz, vielen Dank!
      Jetzt müßte er nur noch entweder beim nächsten @ oder beim nächsten */ (Ende des DocBlock) mit dem Treffer aufhören, dann wäre ich bedient. (Sonst nimmt er noch Teile des nächsten docBlock mit, oder die ganze Datei, wenn es kein @ mehr gibt). Ich probiere auch mal ob ich das hinkriege

      Kommentar


      • #4
        Bei mir tut es das auch brav
        Code:
        Array
        (
            [0] => /**
          * @desc Dies ist der Teil, den ich per Regex rausschneiden will
          *             und dies
          *             und dies
          * @author dies nicht mehr.
          * @copyright und dies auch nicht.
         */
            [1] =>  Dies ist der Teil, den ich per Regex rausschneiden will
          *             und dies
          *             und dies
          * 
        )
        Link zum RegExp-Evaluator

        EDIT:
        Gut, ich sehe das Problem... Ich schaue mal, ob sich noch etwas zaubern lässt.
        Zuletzt geändert von Griecherus; 29.11.2008, 21:16.
        Nieder mit der Camel Case-Konvention

        Kommentar


        • #5
          Nein, wenn @desc der letzte @-Wert im Block ist, nimmt er den nächsten Block mit:

          Link

          Kommentar


          • #6
            Was hälst du denn davon, den ersten Docblock aus einer Datei rauszufischen, bevor du die Regex drüberlaufen lässt? So ala
            PHP-Code:
            $contents file_get_contents($file_name);

            $docblock_opening strpos($contents'/*');
            $docblock_closing strpos($contents'*/');

            if (
            $docblock_opening === false ||
                
            $docblock_closing === false)
            {
                
            // ...
            }

            $block substr($contents$docblock_opening$docblock_closing $docblock_opening); 
            . Das in die Regex zu integrieren wird nämlich nicht trivial, befürchte ich (was nicht heisst, dass ich es nicht weiterhin versuche )


            Grüße
            Nieder mit der Camel Case-Konvention

            Kommentar


            • #7
              Code:
              #(?<!/\*\*)[^/\*\*]*/\*\*.*?@desc([^@]+).*?\*/#s
              Es ließe sich noch so einiges optimieren, aber sollte zumindest schonmal funktionieren

              Als Dankeschön lasse ich mich gerne auf ein Bier einladen, solltest du irgendwann mal in Berlin sein

              Teste mich
              Zuletzt geändert von Griecherus; 30.11.2008, 00:11.
              Nieder mit der Camel Case-Konvention

              Kommentar


              • #8
                Ich will auch nochmal kurz meinen Senf dazu geben. Konnte das jetzt nicht akzeptieren, dass es da noch nichts gibt und habe was eigenes geschrieben ^^
                Klickst du.

                Kommentar


                • #9
                  Reicht

                  Code:
                  #/\*\*.*?@desc([^@|\*/]+)#s
                  Nicht auch aus?

                  mfg

                  Kommentar


                  • #10
                    Original geschrieben von Blackgreetz
                    Reicht

                    Code:
                    #/\*\*.*?@desc([^@|\*/]+)#s
                    Nicht auch aus?

                    mfg
                    OffTopic:

                    Wollt ihr mir etwa mein Bier streitig machen?

                    Nieder mit der Camel Case-Konvention

                    Kommentar


                    • #11
                      Eyyy, coole Sache!
                      @Griecherus: Das Bier ist dir auf jeden Fall sicher!
                      Vielen Dank! Ich werde heute mal die beste Lösung einbauen.

                      Kommentar


                      • #12
                        Original geschrieben von Griecherus
                        OffTopic:

                        Wollt ihr mir etwa mein Bier streitig machen?

                        OffTopic:
                        Damit du nicht leer ausgehst:

                        Kommentar


                        • #13
                          Zum Thema passend: PHP-Desaster hat einen kleinen Docblock-Parser geschrieben, der haargenau zu diesem Thema paßt und die Ergebnisse des Regex übernehmen kann:
                          http://php-resource.de/forum/showthr...threadid=94673

                          Kommentar


                          • #14
                            Falls es noch eine Rolle spielen sollte: Hier die Regex nochmal etwas entschlackt:
                            Code:
                            ~(?<!/\*\*)/\*\*.*?@desc([^@]+|\*/)~s
                            @Blackgreetz: Dein Muster ist nicht gierig genug
                            * und dies
                            * und dies
                            wird nicht gematcht.

                            EDIT:

                            Update



                            Grüße
                            Zuletzt geändert von Griecherus; 01.12.2008, 18:01.
                            Nieder mit der Camel Case-Konvention

                            Kommentar


                            • #15
                              Vielleicht noch eine Lösung ohne Reguläre Ausdrücke, um die Doc-Comments rauszufischen:

                              PHP-Code:
                              function getDocComments($source)
                              {
                                  
                              $doc_comments = array();
                                  
                                  foreach(
                              token_get_all($source) as $token)
                                  {
                                      if(
                              is_array($token) && $token[0] == T_DOC_COMMENT)
                                      {
                                          
                              $doc_comments[] = $token[1];
                                      }
                                  }
                                  
                                  return 
                              $doc_comments;

                              Kommentar

                              Lädt...
                              X