Korbinian: Umsetzung: viele Begriffe aus Datenbank in Text mit Platzhalter integrieren

Eine Frage zur Umsetzung.

Ich habe einen langen Text der immer gleich bleibt, in diesem werden nur bestimmte Daten eingesetzt. Ich lese aus meiner mysql Datenbank die Daten...

stadt
anzahl-gef
anzahl-ins
weibl-in
man-ins

...

die dann in folgenden Text eingesetzt werden sollen.

In {stadt} gibt es {anzahl-gef} Gefängnisse. In diesen sitzen zur Zeit {anzahl-ins} Gefangene ein. Davon wiederum sind {weibl-ins} weiblich und {man-ins} männlich.

Ich denke das einfachste wäre den Text in einem String einlesen und dann einzeln die einzelnen Platzhalter austauschen. Oder gibt es eine elegantere einfachere Lösung.

  1. @@Korbinian

    $stadt = 'Ankh-Morpork';
    $anzahlGef = 3;
    $anzahlIns = 42;
    $weiblIns = 21;
    $manIns = 21;
    	
    $template = 'In %1$s gibt es %2$d Gefängnisse. In diesen sitzen zur Zeit %3$d Gefangene ein. Davon wiederum sind %4$d weiblich und %5$d männlich.';
    
    $ausgabe = sprintf($template, $stadt, $anzahlGef, $anzahlIns, $weiblIns, $manIns);
    
    

    LLAP 🖖

    --
    “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
    1. Hello,

      $stadt = 'Ankh-Morpork';
      $anzahlGef = 3;
      $anzahlIns = 42;
      $weiblIns = 21;
      $manIns = 21;
      	
      $template = 'In %1$s gibt es %2$d Gefängnisse. In diesen sitzen zur Zeit %3$d Gefangene ein. Davon wiederum sind %4$d weiblich und %5$d männlich.';
      
      $ausgabe = sprintf($template, $stadt, $anzahlGef, $anzahlIns, $weiblIns, $manIns);
      
      

      Nur mal ganz dumm gefragt:
      wie lautet denn hier die zugehörige Kontextbehandlung für das Template?

      Liebe Grüße
      Tom S.

      --
      Es gibt nichts Gutes, außer man tut es
      Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
      1. @@TS

        Nur mal ganz dumm gefragt:
        wie lautet denn hier die zugehörige Kontextbehandlung für das Template?

        Für das Template? Weiß nicht, was du damit meinst.

        Oder meinst du: für die Ausgabe? Dann: Je nach Kontext.

        LLAP 🖖

        --
        “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
      2. Tach!

        wie lautet denn hier die zugehörige Kontextbehandlung für das Template?

        Da ich den Kontext nicht kenne, kann ich diese Frage nicht beantworten. Die Behandlung kann aber am besten bei den Parametern für das sprintf() hinzugefügt werden.

        dedlfix.

        1. Hello,

          wie lautet denn hier die zugehörige Kontextbehandlung für das Template?

          Da ich den Kontext nicht kenne, kann ich diese Frage nicht beantworten. Die Behandlung kann aber am besten bei den Parametern für das sprintf() hinzugefügt werden.

          Die Kontext-Betrachtung geht mMn immer in beide Richtungen.

          Wie muss also ein variables Template vorbereitet werden, damit es in sprintf() keine Probleme machen wird?

          Liebe Grüße
          Tom S.

          --
          Es gibt nichts Gutes, außer man tut es
          Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
          1. Tach!

            Die Kontext-Betrachtung geht mMn immer in beide Richtungen.

            Wie muss also ein variables Template vorbereitet werden, damit es in sprintf() keine Probleme machen wird?

            Ich wiederhole mich: Da ich den Kontext nicht kenne, kann ich diese Frage nicht beantworten.

            dedlfix.

    2. Ansich cool, aber was mache ich wenn die Eingabe variablen variieren, wenn also einmal mehr einmal weniger da sind. Ich meine es sind verschiedene Texte und eine große Anzahl an Variablen.

      wenn ich einen Text habe in dem 6 Variablen (Platzhalter) sind dann wieder einen Text in dem 20 Variablen(Platzhalter) sind.

      1. Hallo Korbinian,

        dann ist sprintf mit Position nicht mehr sinnvoll. Vor allem angesichts der von mir unten angerissenen Probleme solltest Du tatsächlich deine Fertigungstiefe überdenken und die Standard-Engines für Templates anschauen.

        Beispiele

        Rolf

        --
        Dosen sind silbern
      2. Hello,

        Ansich cool, aber was mache ich wenn die Eingabe variablen variieren, wenn also einmal mehr einmal weniger da sind. Ich meine es sind verschiedene Texte und eine große Anzahl an Variablen.

        wenn ich einen Text habe in dem 6 Variablen (Platzhalter) sind dann wieder einen Text in dem 20 Variablen(Platzhalter) sind.

        Deshalb fragte ich nach der Vorbehandlung des Templates für den Kontext (hier in Richtung "untergeordneter Kontext"). Gemeint waren damit die Platzhalter im Text.

        #Vorgehensweise:

        • zuerst bestimmst Du die Platzhalter-Begrenzer. Dazu eigenen sich z. B. Konstrukte, wie "<!--{{ ??? }}-->", oder auch nur "[{ ??? }]", ganz nach Geschmack. Es sollten jedenfalls möglichst paarweise Begrenzer sein (also einen für "Start" und einen für "Stop"). Die ??? stehen hier für den eigentlichen Bezeichner in der DB. Diese Begrenzer dürfen dann weder im Roh-Template, noch in den Daten vorkommen. Entweder, men verbietet sie vollkommen, oder sie müssten an beiden Stellen maskiert werden.

        • Nach der Vorbehandlung des Templates kannst Du die (passiven) Werte in die Platzhalter einsetzen. Das geht bei PHP mit einem einfachen str_replace() in der Array-Variante.

        • Du baust Dir dazu ein Array auf, dessen Schlüssel die Platzhalter sind und dessen Werte die einzusetzenden Werte aus der Datenbank sind.

        • mittles zweier Hilfsfunktionen kannst Du dir vorher alle im Text verfügbaren Platzhalter, bzw. alle aus der Datenbank kommenden anzeigen lassen und so kreuzweise abgleichen, ob etwas vergessen wurde.

        • Je nach umgebendem Kentext (z. B. HTML-Ausgabe) kannst Du entscheiden, ob nicht erfüllte Platzhalter aus dem Resultattext entfernt werden sollen, als HTML-Warnug erscheinen sollen, oder aber als (im gerenderten Text) unsichtbare HTML-Komentare stehen bleiben sollen.

        • Die Platzhalterarrays lassen sich auch kaskadieren. Wenn also am Anfang z. B. "{{Fullname}}" im Array steht mit dem zugeorneten Wert "{{Firstname}} {{Familiyname}}" und in späteren Elemente des Arrays die beiden Teilplatzhalter "{{Familyname}}" und "{{Firstname}}" wieder auftauchen mit ihren zugehörigen Werten, dann werden die entsprechend ersetzt.

        Für statische Werte kann mit PHP (und vielen anderen Skriptspreachen) daher mit wenigen Handgriffen leistungsstarke passive Templates aufbauen. Diese Templates können dann von DAUs aufgebaut werden, ohne dass sie Dir die ganze Ausgabe zerschießen, oder sogar Zugriff auf das aktive Backend bekommen.

        Liebe Grüße
        Tom S.

        --
        Es gibt nichts Gutes, außer man tut es
        Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
  2. Hallo Korbinian,

    du kannst so ähnlich vorgehen wie vorgeschlagen wurde - das ist dann eleganter, einfacher Code, aber du produzierst damit Gestammel statt Deutsch, wenn die Anzahlen einen Singular statt Plural erfordern.

    stadt: Klein-Dingenskirchen anzahl-gef: 1 anzahl-ins: 1 weibl-in: 1 man-ins: 0

    "In Klein-Dingenskirchen gibt es 1 Gefängnisse. In diesen sitzen zur Zeit 1 Gefangene ein. Davon wiederum sind 0 weiblich und 1 männlich."

    Wenn das für dich OK ist - alles gut. Wenn nicht, hat die Eleganz nun ein Ende.

    Serienbriefschreibung mit korrekter Grammatik ist nicht trivial. Vor allem nicht im Satzbau deines Beispiels. Du musst alle Stellen des Textes identifizieren, die von Anzahlen abhängig sind, und dann schauen, welche Konjugationen oder Deklinationen erforderlich sind. Bei isolierten Zahlen ist das normalerweise eine Unterscheidung zwischen "Anzahl=1" und "alles andere" - aber das ist bei Dir nicht so. Du hast Frauen und Männer, d.h. du brauchst nicht nur Numerus-Kongruenz, sondern auch Genus-Kongruenz. Die wirst Du kaum nach Standardschema hinbekommen, statt dessen musst du die Kombinationen von "weibl-in = 0 / 1 / sonst" und "man-ins = 0 / 1 / sonst" betrachten und gucken, wieweit Du das separat behandeln musst, um gutes Deutsch herauszubekommen. Ich denke da an Fälle wie "weibl=0 und man=1", dann "sitzt ein Gefangener" ein - ein blödes R, das nur in diesem Fall dorthin muss.

    Sowas ohne Hilfsprogrammierung in ein Template zu bekommen ist durchaus eine Herausforderung. Es wird dann auf eine selbstgemachte Ersatzprogrammiersprache hinauslaufen, oder auf fertige Template-Engines, die sowas mitbringen.

    Viel Glück.

    Rolf

    --
    Dosen sind silbern
    1. @@Rolf b

      Serienbriefschreibung mit korrekter Grammatik ist nicht trivial.

      Und da haben wir es im Deutschen noch einfach. In slawischen Sprachen steht das Substantiv nach 42 in einem anderen Fall als nach 45.

      LLAP 🖖

      --
      “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
      1. Hallo Gunnar,

        Das glaube ich Dir nur mit reputabler Quellenangabe.

        Rolf

        --
        Dosen sind silbern
        1. @@Rolf b

          Das glaube ich Dir nur mit reputabler Quellenangabe.

          https://twitter.com/g16n/status/710822897166761984 f.

          LLAP 🖖

          --
          “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
          1. Hallo Gunnar Bittersmann,

            https://twitter.com/g16n/status/710822897166761984 f.

            Ups. Ich hätte auch ein anderes Substantiv nehmen können.

            • 41 час
            • 42 часа
            • 47 часов

            Oder auch das Lieblingswort aller Schüler, das allerdings google bei der Übersetzung deutsch - russisch nicht anbietet. Du weißt, welches ich meine?

            Bis demnächst
            Matthias

            --
            Rosen sind rot.
            1. @@Matthias Apsel

              Oder auch das Lieblingswort aller Schüler, das allerdings google bei der Übersetzung deutsch - russisch nicht anbietet. Du weißt, welches ich meine?

              Lass mich raten: eins, was in vielen Fällen gleich ist (-ности), wo man also nicht erkennt, dass nach 43 und 49 ein anderer Fall steht?

              LLAP 🖖

              --
              “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
              1. @@Gunnar Bittersmann

                Oder auch das Lieblingswort aller Schüler, das allerdings google bei der Übersetzung deutsch - russisch nicht anbietet. Du weißt, welches ich meine?

                Lass mich raten: eins, was in vielen Fällen gleich ist (-ности), wo man also nicht erkennt, dass nach 43 und 49 ein anderer Fall steht?

                Funfact: Ich war bei der Eröffnung eines Jugendclubs in Bernau dabei (hab dort auch aufgespielt) und an der Abstimmung über dessen Namen teilgenommen. And the winner was: ebendieses Wort. War dann aber wohl doch zu lang und so heißt der Club allgemeinhin Dosto.

                LLAP 🖖

                --
                “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
                1. Hallo Gunnar Bittersmann,

                  War dann aber wohl doch zu lang und so heißt der Club allgemeinhin Dosto.

                  Ebenjenes Wort lässt sich auch als Merkwürdigkeit übersetzen. 😜

                  Bis demnächst
                  Matthias

                  --
                  Rosen sind rot.
                2. Hallo

                  … so heißt der Club allgemeinhin Dosto.

                  Ach herrje, „Punkrocktresen“. Haben die diese Tradition vom (in Bernau-Friedenstal gewesenen) Gurkenwasser oder von der KvU übernommen? GuWa, … das waren noch Zeiten! 😀

                  Tschö, Auge

                  --
                  Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.
                  Toller Dampf voraus von Terry Pratchett
                  1. @@Auge

                    … so heißt der Club allgemeinhin Dosto.

                    Ach herrje, „Punkrocktresen“. Haben die diese Tradition vom (in Bernau-Friedenstal gewesenen) Gurkenwasser oder von der KvU übernommen? GuWa, … das waren noch Zeiten! 😀

                    Wie jetzt, du auch aus Bernau?

                    (Wohl nicht, sonst würdest du ja nicht Friedenstal, sondern Zickzackhausen sagen.)

                    LLAP 🖖

                    --
                    “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
                    1. Hallo

                      … so heißt der Club allgemeinhin Dosto.

                      Ach herrje, „Punkrocktresen“. Haben die diese Tradition vom (in Bernau-Friedenstal gewesenen) Gurkenwasser oder von der KvU übernommen? GuWa, … das waren noch Zeiten! 😀

                      Wie jetzt, du auch aus Bernau?

                      Nein, bloß nicht. Ich war aber in den 1990ern in Bernau und in dessen Umland (bis hoch nach Marienwerder) oft zugange.

                      (Wohl nicht, sonst würdest du ja nicht Friedenstal, sondern Zickzackhausen sagen.)

                      Ich habe mich bezüglich der Verortung des GuWa auf openstreetmap.org nur an der S-Bahn-Linie orientiert. Der Bahnhof Bernau-Friedenstal ist halt dort, wo die Baracke des GuWa früher stand. Zudem ist mir der Name Zickzackhausen tatsächlich unbekannt. Die auf openstreetmap.org angezeigte Bebauung an der Elbestraße lässt mich vermuten, dass sich der Name genau davon ableitet. Standen die Häuser denn in den 1990ern schon?

                      Tschö, Auge

                      --
                      Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.
                      Toller Dampf voraus von Terry Pratchett
                      1. @@Auge

                        Zudem ist mir der Name Zickzackhausen tatsächlich unbekannt. Die auf openstreetmap.org angezeigte Bebauung an der Elbestraße lässt mich vermuten, dass sich der Name genau davon ableitet.

                        Ja. Auch Würfelbauten genannt; wobei jeweils 2 Würfel 2 Wohnungen (jeweils über eine Etage) beherbergen, glaub ich.

                        Standen die Häuser denn in den 1990ern schon?

                        Ja. Ich tippe mal auf in den 80ern erbaut, wenn nicht sogar schon Ende der 70er.

                        Ich erinnere mich an einen Lehrer, der sich immer ereiferte, wenn jemand „Zickzackhausen“ sagte. „Das heißt ‚Angara-Siedlung‘!“ (Die Straßen dort tragen die Namen von Flüssen; eine ist die Angarastraße. „Friedenstal“ war damals völlig unbekannt.)

                        Und mir klingt es im Ohr, als sagte er „Angára-Siedlung“; dabei wird der Fluss doch „Angará“ ausgesprochen. Hätte man ihn mal freundlich darauf hinweisen sollen, wenn er schon andere belehren will, das doch bitteschön richtig zu tun. Hätte er aber nicht gutgefunden, glaube ich. Klugschiss austeilen ja, einstecken nein.

                        LLAP 🖖

                        --
                        “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
        2. Hallo Rolf b,

          Das glaube ich Dir nur mit reputabler Quellenangabe.

          Da kannst du jeden fragen, der im Russisch-Unterricht aufgepasst hat.

          • 1 год
          • 2 года
          • 3 года
          • 4 года
          • 5 лет
          • 41 год
          • 42 года
          • 45 лет

          (1 Jahr / 2 Jahre / 5 Jahre …)

          Bis demnächst
          Matthias

          --
          Rosen sind rot.
  3. Hallo Korbinian,

    hört sich nach einer interessanten Statistik an. Geht das noch weiter ins Detail oder nur männlich/weiblich? Falls umfangreicher, würde mich das fertige Projekt interessieren, wäre also nett, wenn du das dann zeigen würdest, wenn möglich.

    Zu deiner DB selbst, nur als Anregung, wenn's bei den einfachen Einträgen bleibt ohne komplexe Vergleichsrechnungen, würde ich es nicht über Mysql machen, sondern textbasiert/CSV oder allenfalls Sqlite, ist aber nur meine persönliche Vorliebe für kompakte, autarke Anwendungen.

    Gruss
    Henry