LastBoyScout: Variablen am Anfang eines String herausfiltern

1 45

Variablen am Anfang eines String herausfiltern

LastBoyScout
  • php
  • regex
  1. 0
    Tabellenkalk
    1. 0
      LastBoyScout
  2. 0
    LastBoyScout
    1. 0
      Auge
      1. 0
        LastBoyScout
        1. 0
          Auge
          1. 0
            LastBoyScout
            1. 1
              dedlfix
              1. -3
                pl
                1. 1
                  dedlfix
                  1. 0
                    Gunnar Bittersmann
                    1. 2
                      dedlfix
                      1. 0
                        Matthias Apsel
                        1. -1
                          Gunnar Bittersmann
                          1. 2
                            dedlfix
                            1. 0
                              Gunnar Bittersmann
                              1. 0
                                Der Martin
                              2. 0
                                dedlfix
                                1. 0
                                  Tabellenkalk
                                  1. 0
                                    Auge
                                  2. 0
                                    dedlfix
                                  3. 0
                                    Gunnar Bittersmann
                                    1. 0
                                      Der Martin
                                      • klugscheißerei
                      2. 0
                        Christian Kruse
                        • hochwissenschaftliches
                        1. -1
                          Gunnar Bittersmann
                          1. 0
                            Matthias Apsel
                            1. 0
                              Christian Kruse
                            2. 0
                              Gunnar Bittersmann
                          2. 2
                            Christian Kruse
                2. 2
                  Auge
                  • meinung
                3. 2
                  Gunnar Bittersmann
                  • meinung
              2. 0
                LastBoyScout
                1. 1
                  dedlfix
            2. 0
              Der Martin
              1. 0
                dedlfix
                1. 0
                  Der Martin
              2. 0
                LastBoyScout
                1. 0
                  LastBoyScout
                  1. 0
                    dedlfix
                    1. 0
                      LastBoyScout
                      1. 0
                        Gunnar Bittersmann
                        • menschelei
        2. 0
          Jonny 5
          1. 0
            Jonny 5
  3. 0
    Rolf b
    • klugscheißerei
    • php

Hallo miteinander,

Ich stehe vor der Aufgabe, jeweils ein oder mehrere Variablen aus einem String heraus zu filtern. Die Variablen stehen immer am Satzanfang. Bei mehreren Variablen sind diese durch ein Komma mit Leerzeichen getrennt. Hier mal zwei Beispiele:

Wodka, Rum, Gin eigen sich prima für Mixgetränke.
Whisky würde ich eher solo genießen, allenfalls mit etwas Wasser.

Bislang habe ich es zumindest schon mal geschafft, an die Erste Variable zu kommen:

$var = split(' |, ', $str, 2);

Habe allerdings keine Idee, wie ich an die restlichen Spirituosen gelange... ;-)

  1. Hallo,

    Die Variablen stehen immer am Satzanfang.

    Können die Variablen auch Leerzeichen und Kommata enthalten? Z.B. Schottischer Wiskey, dänischer Rum und starker, schwarzer Kaffee sind meine Lieblingsgetränke.
    Dann seh ich schwarz für die Aufgabe.

    Gruß
    Kalk

    1. Können die Variablen auch Leerzeichen und Kommata enthalten? Z.B. Schottischer Wiskey, dänischer Rum und starker, schwarzer Kaffee sind meine Lieblingsgetränke.

      Nein, allenfalls Variablen mit Bindestrich! z.B. Schottischer-Wiskey, dänischer-Rum, Irish-Coffee

      P.S. Allen die hier helfen können, gebe ich Virtuell einen aus!!! ;-)

  2. P.S. Man müsste irgendwie das erste Leerzeichen ohne vorangestelltes Komma identifizieren (nachfolgende ", " müssen schließlich unberücksichtigt bleiben)... dann könnte man schon mal alle Variablen vom restlichen String trennen und müsste sie anschließend nur noch mit explode() vereinzeln!?

    1. Hallo

      P.S. Man müsste irgendwie das erste Leerzeichen ohne vorangestelltes Komma identifizieren (nachfolgende ", " müssen schließlich unberücksichtigt bleiben)... dann könnte man schon mal alle Variablen vom restlichen String trennen und müsste sie anschließend nur noch mit explode() vereinzeln!?

      Wenn du dich auf einwortige Begriffe, die ausschließlich mit Kommata am Satzanfang notiert sind, verlassen können solltest, sollte das so funktionieren. Wenn es aber auch Suchbegriffe mit Leerzeichen gibt, wie es Tabellenkalk schon anmerkte, oder, wie in der deutschen Sprache durchaus üblich, der letzte Wert einer Aufzählung mit einem „und“ statt eines Kommas von den vorherigen Werten getrennt wird, fällt deine Regel in sich zusammen, wie eine ausgetrocknete Sandburg.

      Tschö, Auge

      --
      Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
      Wolfgang Schneidewind *prust*
      1. Wenn es aber auch Suchbegriffe mit Leerzeichen gibt, wie es Tabellenkalk schon anmerkte, oder, wie in der deutschen Sprache durchaus üblich, der letzte Wert einer Aufzählung mit einem „und“ statt eines Kommas von den vorherigen Werten getrennt wird, fällt deine Regel in sich zusammen, wie eine ausgetrocknete Sandburg.

        In den betreffenden Daten gibt es weder Begriffe mit Leerzeichen noch eine Trennung durch "und". Lediglich Variablen mit Bindestrich.

        Allerdings habe ich doch eine Ausnahme gefunden: hier wurde anstatt ", " durch "/ " getrennt. Ich denke das könnte man aber noch berücksichtigen, oder?

        Miene eigentliche Frage lautet nun also: Wie sucht man nach dem ersten Leerzeichen dem kein Kommata oder Schrägstrich vorangestellt ist?

        1. Hallo

          Allerdings habe ich doch eine Ausnahme gefunden: hier wurde anstatt ", " durch "/ " getrennt. Ich denke das könnte man aber noch berücksichtigen, oder?

          Grundsätzlich ja, dann aber (vorerst) nicht mit explode. Die Funktion will einen String als Delimiter haben. Das heißt, dass du nicht nur die Wertekette vom Rest des Satzes trennen, sondern mit zwei möglichen Trennern umgehen musst. Du könntest dazu einerseits explode nacheinander mit zwei Trennern aufrufen oder, vorzugsweise in der schon vom Rest des Satzes getrennten Werteaufzählung, den String „/ “ durch „, “ ersetzen und auf das nun einheitliche Ergebnis explode anwenden.

          Tschö, Auge

          --
          Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
          Wolfgang Schneidewind *prust*
          1. Die eigentlichen Variablen könnte ich dann ja einfach wieder mit split() vereinzeln.

            Bleibt nur die grundsätzliche Frage: Wie sucht man nach dem ersten Leerzeichen im String, dem kein Kommata oder Schrägstrich vorangestellt ist?

            1. Tach!

              Die eigentlichen Variablen könnte ich dann ja einfach wieder mit split() vereinzeln.

              Es sind lediglich Strings, die du da bearbeitest, keine Variablen.

              Bleibt nur die grundsätzliche Frage: Wie sucht man nach dem ersten Leerzeichen im String, dem kein Kommata oder Schrägstrich vorangestellt ist?

              Mit einem regulären Ausdruck mit negativem Look-Behind.

              dedlfix.

              1. Mit einem regulären Ausdruck mit negativem Look-Behind.

                Hast Du'n Knall!? Schmeißt hier mit Buzzworten ... echt ne Heldenleistung.

                1. Tach!

                  Mit einem regulären Ausdruck mit negativem Look-Behind.

                  Hast Du'n Knall!? Schmeißt hier mit Buzzworten ... echt ne Heldenleistung.

                  Kann gut sein. Ich nannte die Fachbegriffe, mit der man eine mögliche Lösung finden kann. Im PHP-Handbuch findet man die im Abschnitt Assertions.

                  dedlfix.

                  1. @@dedlfix

                    Mit einem regulären Ausdruck mit negativem Look-Behind.

                    Im PHP-Handbuch findet man die im Abschnitt Assertions.

                    Hm, im Chomsky-Hierarchie-Handbuch findet man die nicht.

                    LLAP 🖖

                    --
                    “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
                    Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
                    1. Tach!

                      Mit einem regulären Ausdruck mit negativem Look-Behind.

                      Im PHP-Handbuch findet man die im Abschnitt Assertions.

                      Hm, im Chomsky-Hierarchie-Handbuch findet man die nicht.

                      Klär mich auf! Ich kenne den Herrn und sein Werk nicht. Soll ich ihn kennenlernen und wenn ja, warum?

                      Hätte man Assertions in diesem Buch finden müssen und wenn ja, warum? Und warum ausgerechnet dort und nicht über eine allgemeine Websuche?

                      dedlfix.

                      1. Hallo dedlfix,

                        Klär mich auf!

                        Wahrscheinlich handelt es sich dabei nicht um reguläre Ausdrücke.

                        Bis demnächst
                        Matthias

                        --
                        Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
                        1. @@Matthias Apsel

                          Wahrscheinlich handelt es sich dabei nicht um reguläre Ausdrücke.

                          Natürlich nicht.

                          Wer „regulärer Ausdruck mit negativem Look-Behind“ sagt, der sagt auch „UTF-8-Zeichen“. Und „CSS-Klassen“. Und „WLAN-Kabel“. Sachen gibt’s …

                          LLAP 🖖

                          --
                          “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
                          Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
                          1. Tach!

                            Wahrscheinlich handelt es sich dabei nicht um reguläre Ausdrücke.

                            Natürlich nicht.

                            Achso.</gelangweilt> Nichtsdestotrotz finden sich diese Möglichkeiten in einigen Regex-Libraries wieder, und selbst wenn sie der Theorie nach keine regulären Ausdrücke sind, so ist diese Funktionalität doch so nützlich, dass ich mich einen feuchten Kehricht drum schere, dass das nicht der reinen Lehre entspricht.

                            Wer „regulärer Ausdruck mit negativem Look-Behind“ sagt, der sagt auch „UTF-8-Zeichen“. Und „CSS-Klassen“.

                            UTF-8-Zeichen und CSS-Klassen kann man vermeiden, ohne dass die Verständlichkeit leidet. Ich finde es aber nicht sinnvoll, Dinge anders zu benennen, die sich bereits unter einem bestimmten Begriff etabliert haben. Das wäre genauso verwirrend, wie <meta charset="utf-8"> mit den Worten "da muss eine Encoding-Angabe hinzugefügt werden" zu empfehlen.

                            dedlfix.

                            1. @@dedlfix

                              Nichtsdestotrotz finden sich diese Möglichkeiten in einigen Regex-Libraries wieder, und selbst wenn sie der Theorie nach keine regulären Ausdrücke sind, so ist diese Funktionalität doch so nützlich

                              Unbestriten.

                              UTF-8-Zeichen und CSS-Klassen kann man vermeiden, ohne dass die Verständlichkeit leidet.

                              Regulärer Ausdruck (5 Silben) auch: Suchmuster (3 Silben). Kürzer – und treffender. Ich sehe keinen Grund, „regulärer Ausdruck“ zu sagen.

                              Ich finde es aber nicht sinnvoll, Dinge anders zu benennen, die sich bereits unter einem bestimmten Begriff etabliert haben.

                              Ja, es ist vermutlich zu spät, den Begriff „regulärer Ausdruck“ für nicht-reguläre Suchmuster aus den Köpfen der Leute wieder rauszukriegen. Er hätte gar nicht erst hineingebracht worden sein sollen.

                              Das geschah vermutlich durch Leute, die nicht über den theoretischen Hintergrund verfügten zu wissen, was „regulär“ bedeutet. Wie Maurer, die ein Haus bauen, das nie ein Architekt entworfen hat.

                              <meta charset="utf-8">

                              Ebenso. Allerdings wohl zu einer Zeit, als die Unterscheidung noch nicht so relevant war, da zu jedem Zeichensatz (bspw. Latin-1) eine Zeichencodierung (ISO 8859-1) gehörte. Mit Unicode änderte sich das schlagartig.

                              LLAP 🖖

                              --
                              “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
                              Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
                              1. Hallo,

                                Das geschah vermutlich durch Leute, die nicht über den theoretischen Hintergrund verfügten zu wissen, was „regulär“ bedeutet.

                                das Problem droht aber immer, wenn die Fachsprache sich einen Begriff aus der Alltagssprache borgt und mit einer spziellen Bedeutung belegt, die gegenüber der alltagssprachlichen Bedeutung manchmal stark eingeschränkt, manchmal auch völlig anders ist.

                                Regulär bedeutet im Alltag soviel wie regelmäßig oder einer Regel entsprechend (im Englischen auch herkömmlich, gewöhnlich). Und letzteres kann man ja auch über nicht-reguläre Ausdrücke mit Fug und Recht behaupten: Natürlich liegen auch ihnen Regeln zugrunde.

                                <meta charset="utf-8">

                                Ebenso. Allerdings wohl zu einer Zeit, als die Unterscheidung noch nicht so relevant war, da zu jedem Zeichensatz (bspw. Latin-1) eine Zeichencodierung (ISO 8859-1) gehörte. Mit Unicode änderte sich das schlagartig.

                                Dafür sagen heute noch viele Leute, dass sie "e-Mail-Adressen mit Unicode verschlüsseln", und meinen damit nichts anderes als dass sie die Zeichen als NCRs notieren.

                                So long,
                                 Martin

                                --
                                Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
                                - Douglas Adams, The Hitchhiker's Guide To The Galaxy
                              2. Tach!

                                Regulärer Ausdruck (5 Silben) auch: Suchmuster (3 Silben). Kürzer – und treffender. Ich sehe keinen Grund, „regulärer Ausdruck“ zu sagen.

                                Ich sehe keinen Vorteil darin, das nicht dazu zu zählen, wenn die verbreiteten Regex-Bibliotheken diese Funktionalität enthalten. Schicke ich die Leute in Richtung Suchmuster, verlaufen sie sich vermutlich deutlich mehr, als wenn ich sie zu den regulären Ausdrücken schicke, wo sie auf alle Fälle fündig werden. Und wenn ich statt regulärem Ausdruck Regex sage, dann kann daraus auch niemand lernen, dass ich da bewusst einen Unterschied mache. Das ist beides sysnonym.

                                Bei Zeichensatz und Zeichenkodierung ist es nicht unwichtig, das auseinanderzuhalten. Aber wo ist der Nutzen für die Praxis, die Assertions aus den regulären Ausdrücken rauszuhalten? Der Informatik-Theoretiker und der Compilerbauer müssen das sicherlich beachten, der Anwender bekommt aber trotzdem seine Anwendungsfälle gelöst. Die Erdbeere bleibt eine Beere, auch wenn sie eine Nuss ist. Wen störts?

                                dedlfix.

                                1. Hallo,

                                  Die Erdbeere bleibt eine Beere, auch wenn sie eine Nuss ist.

                                  Wie kommst du darauf, dass sie eine Nuss sei?

                                  Gruß
                                  Kalk

                                  1. Hallo

                                    Die Erdbeere bleibt eine Beere, auch wenn sie eine Nuss ist.

                                    Wie kommst du darauf, dass sie eine Nuss sei?

                                    Eine Sammelnussfrucht ist ein Nüsse beherbergender Fruchtkörper. Also ist die Erdbeere eine Nussfrucht. Dass die meisten als Nüsse bezeichneten Früchte botanisch keine sind, setzt der Verwirrung die Krone auf.

                                    Tschö, Auge

                                    --
                                    Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
                                    Wolfgang Schneidewind *prust*
                                  2. Tach!

                                    Die Erdbeere bleibt eine Beere, auch wenn sie eine Nuss ist.

                                    Wie kommst du darauf, dass sie eine Nuss sei?

                                    Ich wollte den Erbsenzählern damit ein paar neue Peanuts hinwerfen.

                                    dedlfix.

                                  3. @@Tabellenkalk

                                    Wie kommst du darauf, dass sie eine Nuss sei?

                                    Das war mal eine Frage bei Günni Jauch:

                                    Welche der Früchte ist keine Beere?

                                    <-beere>[1] | <Gurke>
                                    <Banane> | <Erdbeere>

                                    LLAP 🖖

                                    --
                                    “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
                                    Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|

                                    1. Hab vergessen, welche das war. ↩︎

                                    1. Hallo,

                                      Das war mal eine Frage bei Günni Jauch:

                                      Welche der Früchte ist keine Beere?

                                      <-beere> | <Gurke>
                                      <Banane> | <Erdbeere>

                                      huch - die Gurke ist eine Beere? Die Banane ist eine Beere?
                                      Hm. Was verstehen denn die Botaniker unter einer Beere?

                                      Als Beere gilt in der Botanik eine aus einem einzigen Fruchtknoten hervorgegangene Schließfrucht, bei der die komplette Fruchtwand (Perikarp) auch noch bei der Reife saftig oder mindestens fleischig ist.

                                      Ah ja. Dann ist eine Kirsche wohl auch eine Beere? Wirklich schlauer macht mich das auch nicht ...
                                      Die fehlende Beere in deiner Aufzählung war vielleicht die Johannisbeere?

                                      So long,
                                       Martin

                                      --
                                      Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
                                      - Douglas Adams, The Hitchhiker's Guide To The Galaxy
                      2. Hallo dedlfix,

                        Hm, im Chomsky-Hierarchie-Handbuch findet man die nicht.

                        Klär mich auf! Ich kenne den Herrn und sein Werk nicht. Soll ich ihn kennenlernen

                        IMHO ja.

                        und wenn ja, warum?

                        Weil er einige Grundlagen der modernen Informatik gelegt hat. IMHO sollte jeder Software-Entwickler zumindest grundlegend mit Chomsky vertraut sein.

                        Gunnars Beharren auf der Tatsache, dass heutige Regexe nicht regulär sind finde ich allerdings auch wenig sinnvoll, jeder weiß was mit diesem Ausdruck gemeint ist. Etablierte Begriffe der Lehre wegen zu ändern ist wenig erfolgversprechend und sorgt nur für Verwirrung.

                        LG,
                        CK

                        1. @@Christian Kruse

                          Gunnars Beharren auf der Tatsache, dass heutige Regexe nicht regulär sind finde ich allerdings auch wenig sinnvoll, jeder weiß was mit diesem Ausdruck gemeint ist.

                          Es mag noch ein Unterschied zwischen „Regex“ und „regulärer Ausdruck“ bestehen – ebenso wie charset nicht für character set steht, sondern für Zeichencodierung.

                          Etablierte Begriffe der Lehre wegen zu ändern ist wenig erfolgversprechend

                          Leider ja.

                          und sorgt nur für Verwirrung.

                          Die falsche Verwendung von Begriffen sorgt aber auch für Verwirrung. Siehe character set.

                          Viele Probleme entstehen dadurch, dass der Unterschied zwischen Zeichensatz und Zeichencodierung nicht bekannt ist/nicht beachtet wird, was sich dann auch in der Sprache niederschlägt. Oder andersrum: dass durch die Verwechslung der Begriffe das Problem nicht erkannt wird.

                          Es gab eine Zeit, da tauchten massenhaft Fragen dazu hier im Forum auf. Durch die Verbreitung von UTF-8 haben die inzwischen nachgelassen.

                          Was ich sagen will: Die falsche Verwendung von Begriffen deutet oft auf das Unverständnis der Konzepte dahinter hin.

                          Und für Verwirrung könnte auch sorgen, wenn jemand, der weiß was „regulär“ bedeutet, die Frage „Wie kann ich x finden, aber nur wenn y und nicht z? Geht das mit einem regulären Ausdruck?“ (richtigerweise!) mit „Nein“ beantwortet.

                          LLAP 🖖

                          --
                          “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
                          Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
                          1. Hallo Gunnar Bittersmann,

                            Und für Verwirrung könnte auch sorgen, wenn jemand, der weiß was „regulär“ bedeutet, die Frage „Wie kann ich x finden, aber nur wenn y und nicht z? Geht das mit einem regulären Ausdruck?“ (richtigerweise!) mit „Nein“ beantwortet.

                            Mal für mich zum Verständnis: regulär heißt, dass es einen DEA gibt, der das entscheiden kann?

                            Für deine allgemeine Fragestellung lassen sich sicher solche Automaten konstruieren. Ein Wort wird dann akzeptiert, wenn x und y vorkommen aber kein z.

                            Bis demnächst
                            Matthias

                            --
                            Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
                            1. Hallo Matthias,

                              Mal für mich zum Verständnis: regulär heißt, dass es einen DEA gibt, der das entscheiden kann?

                              Ja.

                              Für deine allgemeine Fragestellung lassen sich sicher solche Automaten konstruieren. Ein Wort wird dann akzeptiert, wenn x und y vorkommen aber kein z.

                              Ja, aber zero-width assertions sind mit einem endlichen Automaten nicht möglich. Das gleiche gilt übrigens für back references.

                              LG,
                              CK

                            2. @@Matthias Apsel

                              Mal für mich zum Verständnis: regulär heißt, dass es einen DEA gibt, der das entscheiden kann?

                              Ja. Die Menge der regulären Sprachen ist gleich der Menge der Sprachen, die von einem deterministischen endlichen Automaten erkannt werden können, ist gleich der Menge der Sprachen, die von einem nicht-deterministischen endlichen Automaten erkannt werden können, ist gleich der Menge der Sprachen, die durch einen regulären(!) Ausdruck beschrieben werden können. Übersicht

                              LLAP 🖖

                              --
                              “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
                              Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
                          2. Hallo Gunnar,

                            Gunnars Beharren auf der Tatsache, dass heutige Regexe nicht regulär sind finde ich allerdings auch wenig sinnvoll, jeder weiß was mit diesem Ausdruck gemeint ist.

                            Es mag noch ein Unterschied zwischen „Regex“ und „regulärer Ausdruck“ bestehen

                            Nicht im regulären Sprachgebrauch (pun intended).

                            Was ich sagen will: Die falsche Verwendung von Begriffen deutet oft auf das Unverständnis der Konzepte dahinter hin.

                            Die wenigsten Entwickler, die ich kenne, haben jemals von Chomsky gehört. Natürlich haben sie keine Ahnung von den theoretischen Konzepten zu formalen Sprachen. Das müssen sie aber auch nicht, um Regexe anwenden zu können. Und da mit dem Begriff „regulärer Ausdruck” oder „Regex” jeder weiß, was gemeint ist, ist das auch nicht wichtig, dass de fakto keine mir bekannte Regex-Engine wirklich regulär (sprich: Chomsky Typ 3) ist.

                            Und für Verwirrung könnte auch sorgen, wenn jemand, der weiß was „regulär“ bedeutet, die Frage „Wie kann ich x finden, aber nur wenn y und nicht z? Geht das mit einem regulären Ausdruck?“ (richtigerweise!) mit „Nein“ beantwortet.

                            Dem Antwortenden würde ich vorwerfen Nitpicking zu betreiben, er muss wissen, dass damit nicht eine theoretische Regex-Engine gemeint ist, sondern das, was tatsächlich auch verwendet wird. Und so habe ich auch immer meine Antworten im Bereich Regex verfasst: in Hinblick auf die verwendete Regex-Engine. Denn die unterscheiden sich eh dermaßen stark, dass sich anders auch gar keine Antwort geben lässt.

                            LG,
                            CK

                2. Hallo

                  Mit einem regulären Ausdruck mit negativem Look-Behind.

                  Hast Du'n Knall!?

                  Hast du kein Benehmen?

                  Schmeißt hier mit Buzzworten ... echt ne Heldenleistung.

                  Deine Kritik wäre ernst zu nehmen, wenn du nicht mit deinem Nichts eine noch viel größere „Heldenleistung“ abliefertest. So lese ich nur ich-will-mal-wieder-provozieren-bla-bla.

                  Tschö, Auge

                  --
                  Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
                  Wolfgang Schneidewind *prust*
                3. @@pl

                  Hast Du'n Knall!? Schmeißt hier mit Buzzworten ... echt ne Heldenleistung.

                  Darf ich mir das Zitat zur Wiederverwendung aufheben? Das passt so gut als Antwort auf etliche deiner Postings.

                  LLAP 🖖

                  --
                  “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
                  Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
              2. Mit einem regulären Ausdruck mit negativem Look-Behind.

                Bei regex sehe ich immer nur böhmische Dörfer... könntest du mir bitte ein Beispiel geben!?

                1. Tach!

                  Mit einem regulären Ausdruck mit negativem Look-Behind. Bei regex sehe ich immer nur böhmische Dörfer... könntest du mir bitte ein Beispiel geben!?

                  Kann ich, gibts unter anderem in der Beschreibung der Assertions im PHP-Handbuch.

                  Assertions haben die Eigenschaft, dass man vorwärts und rückwärts vom Suchbegriff aus nach weiteren Bedingungen suchen kann, ohne dass diese in die Ergebnismenge einfließen. Diese Assertions werden also nicht "captured". Zum Beispiel, wenn du an einem x splitten möchtest, dem ein y vorangeht, das y aber nicht Teil des Trennzeichens x sein soll, dann kann man eine Assertion nehmen, um nach dem y zu suchen.

                  dedlfix.

            2. Hallo,

              Die eigentlichen Variablen könnte ich dann ja einfach wieder mit split() vereinzeln.

              keine gute Idee: Zum einen, weil split() als veraltet gilt und in PHP 7 ganz entfällt, zum andern, weil du doch die Trennzeichen (Komma) genau kennst und explode() damit wesentlich effizienter wäre, als dafür nochmal die Regex-Maschine anzuwerfen.

              Bleibt nur die grundsätzliche Frage: Wie sucht man nach dem ersten Leerzeichen im String, dem kein Kommata oder Schrägstrich vorangestellt ist?

              Da landen wir wohl tatsächlich beim Regex. Der Teilausdruck /[^,/]\s/ sucht nach Whitespace (das schließt Zeilenumbrüche oder Tabs ein), dem kein Komma oder Schrägstrich vorausgeht.

              So long,
               Martin

              --
              Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
              - Douglas Adams, The Hitchhiker's Guide To The Galaxy
              1. Tach!

                Der Teilausdruck /[^,/]\w/ sucht nach Whitespace (das schließt Zeilenumbrüche oder Tabs ein), dem kein Komma oder Schrägstrich vorausgeht.

                Vielleicht fällt das für den aktuellen Fall nicht weiter auf, aber genaugenommen muss das formulieren als: "... dem ein Zeichen vorausgeht, das kein Komma oder Schrägstrich ist." Auch am Anfang der Zeichenkette steht vor dem Suchbegriff kein anderes Zeichen, aber diese Fälle würden nicht gefunden werden.

                dedlfix.

                1. Hi,

                  Der Teilausdruck /[^,/]\w/ sucht nach Whitespace (das schließt Zeilenumbrüche oder Tabs ein), dem kein Komma oder Schrägstrich vorausgeht.

                  Vielleicht fällt das für den aktuellen Fall nicht weiter auf, aber genaugenommen muss das formulieren als: "... dem ein Zeichen vorausgeht, das kein Komma oder Schrägstrich ist."

                  hmm ... spitzfindig, aber korrekt. Danke für den Hinweis.

                  Auch am Anfang der Zeichenkette steht vor dem Suchbegriff kein anderes Zeichen, aber diese Fälle würden nicht gefunden werden.

                  Stimmt. Nur gut, dass das hier keine Rolle spielt. ;-)

                  Ciao,
                   Martin

                  --
                  Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
                  - Douglas Adams, The Hitchhiker's Guide To The Galaxy
              2. keine gute Idee: Zum einen, weil split() als veraltet gilt und in PHP 7 ganz entfällt, zum andern, weil du doch die Trennzeichen (Komma) genau kennst und explode() damit wesentlich effizienter wäre, als dafür nochmal die Regex-Maschine anzuwerfen.

                So könnte ich doch aber nicht nur anhand ", " trennen, sondern auch den Ausnahmefall "/ " berücksichtigen!?

                Da landen wir wohl tatsächlich beim Regex. Der Teilausdruck /[^,/]\s/ sucht nach Whitespace (das schließt Zeilenumbrüche oder Tabs ein), dem kein Komma oder Schrägstrich vorausgeht.

                Ich hab´s jetzt wie nachfolgend, erhalte jedoch ne Fehlermeldung: Unknown modifier ']'

                $temp = preg_split('/[^,/]\w/', $str, 2, PREG_SPLIT_NO_EMPTY);
                
                1. Die Mittagspause hat geholfen den Fehler zu finden: Ein im Suchmuster verwendetes Zeichen sollte sinnigerweise nicht als Delimiter fungieren.

                  Das Suchmuster hat nun aber zu folge, dass er zwar den String am ersten Leerzeichen ohne vorangestelltes Kommata oder Schrägstrich teilt, jedoch jedes anderer vorangestellte Zeichen (hier das "n" von "Gin") mit entfernt:

                  Wodka, Rum, Gin eigen sich prima für Mixgetränke.
                  
                  Array (
                      [0] = Wodka, Rum, Gi
                      [1] = eigen sich prima für Mixgetränke.
                  )
                  
                  1. Tach!

                    Das Suchmuster hat nun aber zu folge, dass er zwar den String am ersten Leerzeichen ohne vorangestelltes Kommata oder Schrägstrich teilt, jedoch jedes anderer vorangestellte Zeichen (hier das "n" von "Gin") mit entfernt:

                    Deswegen Assertions.

                    dedlfix.

                    1. Deswegen Assertions.

                      Ich glaub jetzt hab ichs kapiert:

                      #(?<=[^,/])\s#
                      

                      Cheers, Santé und Prost alle Beteiligten ;-)

                      1. @@LastBoyScout

                        jedoch jedes anderer vorangestellte Zeichen (hier das "n" von "Gin") mit entfernt:

                        Cheers, Santé und Prost alle Beteiligten ;-)

                        Da ist schon wieder ein Zeichen entfernt worden‽ ;-)

                        LLAP 🖖

                        --
                        “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
                        Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
        2. Hallo!

          Miene eigentliche Frage lautet nun also: Wie sucht man nach dem ersten Leerzeichen dem kein Kommata oder Schrägstrich vorangestellt ist?

          Oder: Wie findet man einzelne Wörter einer Kette von Wörtern, die an den Start des Strings geleimt ist und durch ein Komma + Leerzeichen gegliedert ist.

          Ein regex Muster könnte so aussehen, falls ich das Problem richtig verstanden habe:

          \G(?:, )?\K[\w-]+
          
          • Der \G Anker ist sozusagen der Leim. Er passt auf den Start des Strings und die Stelle, an welcher ein vorrangegangener Treffer endet.
          • (?:, )? Eine optionale sog. non-capturing group, welche ein Komma mit einem nachgestellten Leerzeichen enthält. Optional, da das Komma mit Leerzeichen auf den Anfang nicht zutrifft.
          • \K Escape-Sequenz setzt den Anfang des Treffers zurück.
          • [\w-]+ Eine Zeichenklasse, die Wortzeichen und ein Minus enthält. Jeweils 1 oder mehr hiervon.

          Anzuwenden mit preg_match_all. Hier ein PHP Test auf eval.in oder regex Test auf regex101.

          1. Schrägstrich hatte ich übersehen.

            Das Suchmuster kann natürlich beliebig erweitert werden.

            Z.B. '~\G(?:, | ?/ ?)?\K[\w-]+~'

            LG, Robert

  3. Regexe mit Assertions muss man gut kommentieren, gerade wenn man neu im Thema ist, sonst versteht man sie am nächsten Tag nicht mehr :)

    Aber falls Dir der Tyrannosuchus Regex zu wild wird, kannst Du es auch auf die primitive Tour versuchen.

    1. Ergebnisarray vorbereiten: $sprit = ARRAY();
    2. String nur an den Leerstellen splitten (mit Technik nach Belieben) -> ergibt $var Array
    3. $fertig = false
    4. $var von vorne nach hinten durchlaufen
      • $gesoeff = str_replace(ARRAY(",", "/"), "", $var[i]) // Satzzeichen weg
      • array_push($sprit, $gesoeff)
      • if ($gesoeff == $var[i]) break; // Ende wenn Getränk ohne Satzzeichen vorlag

    Ist jetzt nur Pseudocode, ich bin kein echter PHP Crack.

    Gruß Rolf