Yadgar: Problem mit strpos()

Hi(gh)!

Weiter, immer weiter geht es mit meinem Orgeldatenbank-Projekt... jetzt bin ich mal wieder an einem Punkt, wo ich akut an meinem Verstand zweifele. Und zwar:

Ein Formular übergibt folgenden String:

"Pedal, 32 Tasten (C bis g'), Vollpedal, vertikal geschweift"

Dann wird mittels strpos() auf Vorkommen von "vertikal geschweift" getestet...

...obwohl der Teilstring vorhanden ist, bekomme ich immer bool(false)! Wieso? Kommt strpos() mit Whitespace im Teilstring nicht klar?

Bis bald im Khyberspace!

Yadgar

  1. Hallo,

    Ein Formular übergibt folgenden String:

    "Pedal, 32 Tasten (C bis g'), Vollpedal, vertikal geschweift"

    Dann wird mittels strpos() auf Vorkommen von "vertikal geschweift" getestet...

    ...obwohl der Teilstring vorhanden ist, bekomme ich immer bool(false)! Wieso? Kommt strpos() mit Whitespace im Teilstring nicht klar?

    mit Whitespace hat strpos() ganz sicher keine Probleme. Die Funktion vergleicht Zeichen für Zeichen, oder genauer, Byte für Byte, ohne sich um deren Bedeutung zu kümmern.

    Aber untersuche den übergebenen String bitte mal genau. Sind im gesuchten Anschnitt wirklich alle Zeichen gleich? Ein Leerzeichen oder zwei Leerzeichen, Leerzeichen oder Tab? Gerade bei Whitespace gibt es ja einige Unterschiede, die man mit bloßem Auge nicht sieht.

    Lass dir also den String beispielsweise mal mit echo bin2hex($string); ausgeben. Die Funktion ist zwar nicht unbedingt dafür gedacht, eignet sich aber gut dafür, alle Zeichencodes im String genau zu analysieren.

    So long,
     Martin

    1. Hi(gh)!

      Lass dir also den String beispielsweise mal mit echo bin2hex($string); ausgeben. Die Funktion ist zwar nicht unbedingt dafür gedacht, eignet sich aber gut dafür, alle Zeichencodes im String genau zu analysieren.

      Bittesehr:

      Gesamtstring:

      506564616c2c2033322054617374656e20284320626973206727292c20566f6c6c706564616c2c2076657274696b616c2067657363687765696674

      Teilstring:

      76657274696b616c2067657363687765696674

      Teilstring kommt im Gesamtstring vor, also dürfte strpos() kein FALSE zurückgeben! Ich stehe vor einem Rätsel...

      Bis bald im Khyberspace!

      Yadgar

      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

        Hast Du vielleicht needle und haystack vertauscht in den Funktionsargumenten?

        Spirituelle Grüße
        Euer Robert
        robert.r@online.de

        --
        Möge der wahre Forumsgeist ewig leben!
        1. Hi(gh)!

          Hast Du vielleicht needle und haystack vertauscht in den Funktionsargumenten?

          anKoppklatsch Natürlich, erst der Heuhaufen, dann die Nadel! Damit ist alles klar!

          Danke für den Tipp!

          Wieviele Programmierstunden mögen allein durch die Tatsache, dass Menschen keine Maschinen sind, die immer 100 % Leistung bringen, sinnlos verplempert werden? Ich wäre gerne so ausdauernd, zuverlässig und präzise wie mein Computer! Es wird höchste Zeit, dass ich selbst zum Computer werde - Singularität, komme über uns!!!

          Bis bald im Khyberspace!

          Yadgar

          1. Moin!

            anKoppklatsch Natürlich, erst der Heuhaufen, dann die Nadel! Damit ist alles klar!

            Nein. "Natürlich" ist das gerade nicht und ich bin nicht der einzige, der das für einen Designfehler der Sprache hält. Kann aber sein, dass das darin liegt, dass wir Deutschen etwas wie "Position der Nadel im Haufen" sprechen und also denken und also notieren während vielleicht ein Anglophoner etwas wie "Position im Haufen der Nadel" formuliert.

            Du bist nicht allein, ist mir auch oft passiert.

            Jörg Reinholz

            1. Hallo Jörg,

              Nein. "Natürlich" ist das gerade nicht und ich bin nicht der einzige, der das für einen Designfehler der Sprache hält.

              Naja, wirklich problematisch ist ja hauptsächlich, dass die Reihenfolge wechselt:

              int strpos  ( string $haystack  , mixed $needle  [, int $offset= 0  ] )
              string stristr ( string $haystack , mixed $needle [, bool $before_needle = false ] )
              bool in_array  ( mixed $needle  , array $haystack  [, bool $strict  ] )
              mixed array_search  ( mixed $needle  , array $haystack  [, bool $strict  ] )
              

              Nur deshalb habe ich mir in meinem Emacs einen Shortcut eingebaut, der mir den Prototypen der Funktion einfügt, ich konnte mir einfach nicht merken, welche Reihenfolge der Argumente bei welcher Funktion jetzt richtig ist.

              LG,
              CK

    2. Tach!

      Lass dir also den String beispielsweise mal mit echo bin2hex($string); ausgeben.

      urlencode() ist für solche Fälle besser zu missbrauchen, weil es die meisten unproblematischen Zeichen lesbar lässt und nur die kritischen kodiert, auf dass man sie dann besser zwischen den anderen finde.

      dedlfix.

      1. Hi,

        Lass dir also den String beispielsweise mal mit echo bin2hex($string); ausgeben.

        urlencode() ist für solche Fälle besser zu missbrauchen, weil es die meisten unproblematischen Zeichen lesbar lässt und nur die kritischen kodiert, auf dass man sie dann besser zwischen den anderen finde.

        guter Punkt, ja.
        Ich bin wieder unbewusst von mir ausgegangen, und ich lese ja zumindest ASCII auch im Hexdump nahezu fließend. ;-)

        Ciao,
         Martin