Ankündigung

Einklappen
Keine Ankündigung bisher.

Template-Strings für Parser mit optionalen Komponenten - Best Practices?

Einklappen

Neue Werbung 2019

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

  • Template-Strings für Parser mit optionalen Komponenten - Best Practices?

    Hallo zusammen,

    ich arbeite schon seit Längerem an einem kleinen Projekt - einem Kommandozeilenprogramm zum Bearbeiten von Hörbüchern. Nun möchte ich gerne eine "Batch-Processing-Funktion" einbauen, in dem ich Tag-Daten aus Verzeichnis-Strukturen auslese. Ich habe folgende Verzeichnisstruktur:

    Code:
    /<autor>/<series>/<series-part> - <title>/
    // alternativ - wenn es keine Serie ist
    /<autor>/<title>/
    Konkretes Beispiel:

    Code:
    /Patrick Rothfuss/Die Königsmörder-Chronik/1 - Der Name des Windes/cover.jpg
    /Patrick Rothfuss/Die Königsmörder-Chronik/2.1 - Die Furcht des Weisen/cover.jpg
    /Joanne K. Rowling/Harry Potter/1 - Harry Potter und der Stein der Weisen/cover.jpg
    /Jane Austen/Stolz und Vorurteil/cover.jpg
    An der cover.jpg, die immer im Hauptverzeichnis liegt, mache ich erstmal die Erkennung fest, dass es sich um ein Hörbuch handelt (vorläufig). Daher die Angabe im jeweiligen Verzeichnis...

    Nun möchte ich gerne dem Programm einen Parameter --batch-pattern hinzufügen, über den man ein ganzes Verzeichnis mit Unterverzeichnissen verarbeiten kann und dabei sollen für das Tagging die Verzeichnisnamen als Grundlage dienen. Mein erster Ansatz: Man könnte mehrere Patterns als Pseudo-Reguläre-Ausdrücke über --batch-pattern angeben und den ersten Matchenden Ausdruck verwenden. Dabei könnte man die benannte Variante von Regulären Ausdrücken verwenden, um das ganze zu vereinfachen.

    Beispiel:
    Code:
    --batch-pattern="/%a/%s/%p - %t/" --batch-pattern="/%a/%t/"
    
    wird zu den Ausdrücken
    
    #^(?P<author>[^/]+)/(?P<series>[^/]+)/((?P<part>[0-9\.]+)) - (?P<title>[^/]+)/$#
    und
    #^(?P<author>[^/]+)/(?P<title>[^/]+)/$#
    Diese werden auf die jeweiligen Verzeichnisnamen angewendet - im Falle einer Hörbuchserie mit mehreren Teilen matcht der erste Ausdruck, in anderen Fällen der zweite.

    Ich wollte diesen Ansatz einfach mal zur Diskussion stellen und nachfragen, ob es auch eleganter und benutzerfreundlicher geht?!
    Tutorials zum Thema Technik:
    https://pilabor.com
    https://www.fynder.de

  • #2
    Hi,
    eine Notation wie sie einige Nutzer schon aus den Systembefehlen kennen reicht hier nicht aus?
    Also eine Suche wie
    Code:
     
     /Patrick Rothfuss/Die Königsmörder-Chronik/*/cover.jpg
    Neben den bekannten Wildcards wie * und ? würde ich einfach noch alles zulassen was glob() verarbeitet wie z.B. Zeichenklassen.

    LG jspit

    Kommentar


    • #3
      Schonmal danke für die Antwort. Ich verstehe was du meinst, aber ich glaube ich habe mich missverständlich ausgedrückt. Es geht nicht um Platzhalter allgemein, sondern um darum, wo sie denn stehen...
      Ich will also so eine Art "\DateTime::createFromFormat" nachbauen, um die Tags aus einem Verzeichnisnamen auszulesen. Beispiel:

      PHP-Code:
      $date DateTime::createFromFormat('j-M-Y''15-Feb-2009');

      $tag Tags::createFromFormat("%a/%s/%p - %t/""Patrick Rothfuss/Die Königsmörder-Chronik/1 - Der Name des Windes/");
      echo 
      $tag->author// Patrick Rothfuss
      echo $tag->series// Die Königsmörder-Chronik
      echo $tag->seriesPart// 1
      echo $tag->title// Der Name des Windes 
      Ich hoffe, dadurch wird klarer, was ich meine. Falls noch ein weiteres Beispiel gebraucht wird, kannst du dir mal den Unit-Test testFromFormat von meiner TimeUnit-Klasse anschauen:

      https://github.com/sandreas/php-time...meUnitTest.php

      https://github.com/sandreas/php-time...e/TimeUnit.php

      Ich hoffe, es wird durch meine neue Erklärung etwas deutlicher, was ich möchte

      Tutorials zum Thema Technik:
      https://pilabor.com
      https://www.fynder.de

      Kommentar


      • #4
        http://php.net/manual/de/function.ss...p#example-6110 bringt dir da nichts?
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          hausl
          Vielen Dank... Grundsätzlich wäre das die richtige Funktion, allerdings ist scanf an die Reihenfolge der Argumente gebunden und unterstützt Platzhalter nur sehr eingeschränkt, z.B. gibt es Autoren mit 3 Namen und manche mit 2. Das hieße dann, dass ich einmal

          PHP-Code:
          scanf("%s %s %s"$authorNames);
          scanf("%s %s"$authorNames); 
          ausführen müsste. Beim Datum hat man außerdem den Vorteil, dass es sich um Zahlen oder konstante Strings handelt (0-9, January - December, Sunday - Monday, etc.). Bei Namen kann es vorkommen, dass die deutlich komplexer sind. Beispiel für einen schwierig zu parsenden Eingabewert:

          PHP-Code:
          $tag Tags::createFromFormat("%a - %t/""Marc-Uwe Kling - Die Känguru-Apokryphen/");
          var_dump($tag->author); // Marc-Uwe Kling
          var_dump($tag->series); // null
          var_dump($tag->seriesPart); // null
          var_dump($tag->title); // Die Känguru-Apokryphen 

          Es ging aber auch weniger um einen konkreten Lösungsvorschlag via PHP Funktion, sondern um einen generellen Best-Practice-Ansatz, wie man an so etwas heran geht. Ich denke, ich werde dann wie bei der Time-Unit-Klasse vorgehen - das erschien mir nur etwas komplex, ich dachte, das müsste auch einfacher gehen.
          Tutorials zum Thema Technik:
          https://pilabor.com
          https://www.fynder.de

          Kommentar


          • #6
            So, falls es noch jemanden interessiert, ich habe mal erste Implementierung gemacht:

            https://github.com/sandreas/php-stri...rmatParser.php

            Und der Test dazu:
            https://github.com/sandreas/php-stri...ParserTest.php

            Die ist alles andere als perfekt und in puncto Performance vermutlich eine Katastrophe, aber für meine Zwecke wird die erstmal reichen
            Tutorials zum Thema Technik:
            https://pilabor.com
            https://www.fynder.de

            Kommentar

            Lädt...
            X