Linuchs: PHP strpos spinnt

Hallo,

in einem Texarea-Feld suche ich nach einem Eintrag zwischen den beiden Zeichen # "Gefunden" gilt nur dann, wenn ich das erste UND zweite # gefunden habe.

Doch strpos sieht auch ein ' als # an:

    $band_name = '';
    $test_str = "Mit #[a]http://www.shakin-cats.de/[@]Shakin' Cats[/a]";
    $test_str = $row['beschreibung'];
    $band_start_pos = strpos( $test_str, '#' );  // erstes Zeichen # $row['beschreibung']
    if ( $band_start_pos !== FALSE ) {
echo "[".$row['beschreibung']."]<br>";
echo "[".$test_str."]<br>";
echo "band_start_pos=[".$band_start_pos."]<br>";
      $band_end_pos = strpos( $test_str, '#', $band_start_pos +1 );  // zweites Zeichen #
      if ( $band_end_pos !== FALSE ) {
echo "band_end_pos=[".$band_end_pos."]<br>";
        $band_name = substr( $test_str, $band_start_pos +1, $band_end_pos - $band_start_pos +1 );
echo "[".$band_name."]<br>";
      }
    }

Ausgabe:

[Mit #[a]http://www.shakin-cats.de/[@]Shakin' Cats[/a]]
[Mit #[a]http://www.shakin-cats.de/[@]Shakin' Cats[/a]]
band_start_pos=[4]
band_end_pos=[44]
[[a]http://www.shakin-cats.de/[@]Shakin�]

Was geht da ab?

Linuchs

  1. Tach!

    Doch strpos sieht auch ein ' als # an:

    Bei mir nicht.

    Was geht da ab?

    $band_end_pos wird mir als false angezeigt, wenn ich statt der einfachen echos ein aussagekräftigeres var_dump() verwende. Was steht wirklich in $test_str? Einmal urlencode() missbrauchen und die Nicht-Buchstaben werden so ausgegeben, dass man eine Zeichentabelle drauf ansetzen kann. Dein [[a]http://www.shakin-cats.de/[@]Shakin�] deutet auf ein Kodierungsproblenm hin.

    Außerdem wäre es schön, wenn du die Beispiel nachvollziehbar gestalten würdest und man nicht erst noch überflüssige Zeilen rausoperieren müsste, damit es läuft.

    dedlfix.

    1. Moin dedlfix,

      Dein [[a]http://www.shakin-cats.de/[@]Shakin�] deutet auf ein Kodierungsproblenm hin.

      Tja, den Verdacht hatte ich auch schon. Alles ist (sollte) im UTF-8 Codebereich liegen. Ich gebe die Veranstaltung ein und das Hochkomma bei Shakin' Cats kommt von der Tastatur.

      Inzwischen habe ich strpos durch mb_strpos ersetzt, ohne Erfolg. Das Hochkomma bleibt ein Problem.

      Außerdem wäre es schön, wenn du die Beispiel nachvollziehbar gestalten würdest und man nicht erst noch überflüssige Zeilen rausoperieren müsste, damit es läuft.

      Du meinst die echos? Die sollen doch den Verleich mit der Ausgabe ermöglichen.

      Linuchs

      1. Moin!

        Dein [[a]http://www.shakin-cats.de/[@]Shakin�] deutet auf ein Kodierungsproblenm hin.

        Tja, den Verdacht hatte ich auch schon. Alles ist (sollte) im UTF-8 Codebereich liegen. Ich gebe die Veranstaltung ein und das Hochkomma bei Shakin' Cats kommt von der Tastatur.

        Alle PHP-Versionen seit 5.4.8 finden kein zweites # in deinem String.

        Außerdem wäre es schön, wenn du die Beispiel nachvollziehbar gestalten würdest und man nicht erst noch überflüssige Zeilen rausoperieren müsste, damit es läuft.

        Du meinst die echos? Die sollen doch den Verleich mit der Ausgabe ermöglichen.

        Echos mit Variablen, die nirgends definiert wurden, wie z.B. $rows

        Grüße Sven

      2. Tach!

        Dein [[a]http://www.shakin-cats.de/[@]Shakin�] deutet auf ein Kodierungsproblenm hin.

        Tja, den Verdacht hatte ich auch schon. Alles ist (sollte) im UTF-8 Codebereich liegen. Ich gebe die Veranstaltung ein und das Hochkomma bei Shakin' Cats kommt von der Tastatur.

        Dann prüf doch bitte was da konkret vorliegt! Ich nannte dir ja schon urlencode(), was man dafür sehr gut missbrauchen kann. Du kannst natürlich auch bin2hex() nehmen, aber dessen Ergebnis liest sich deutlich schwieriger.

        Inzwischen habe ich strpos durch mb_strpos ersetzt, ohne Erfolg. Das Hochkomma bleibt ein Problem.

        Einfach was anderes probieren, ohne die Ursache ermittelt zu haben, ist oft nur zufällig zielführend. Wenn du die mb-Funktionen verwendest, ist auch noch die eine oder andere Funktion davon aufzurufen, um ein paar Konfigurationswerte festzulegen, damit die Funktionen korrekt arbeiten können. Hast du das gemacht, so wie das im PHP-Handbuch beschrieben ist? Aber wie gesagt, erstmal die Ursache finden und dann Lösungen zielgerichtet einsetzen.

        dedlfix.

      3. @@Linuchs

        Ich gebe die Veranstaltung ein und das Hochkomma bei Shakin' Cats kommt von der Tastatur.

        […] Das Hochkomma bleibt ein Problem.

        Das Zeichen ' hat in natürlichsprachigem Text auch nichts zu suchen. Das Apostroph-Zeichen ist ’.

        LLAP 🖖

        --
        Ist diese Antwort anstößig? Dann könnte sie nützlich sein.
  2. Hi,

    Dein Code ist ein Chaos, das ist doch nicht Dein Ernst oder? Außerdem vermute ich auch in der Vorgeschichte/Erhebung Deiner Daten chaotische Verhältnisse, denn

    
    > Shakin�
    
    

    das komische Zeichen hinter Shakin heißt REPLACEMENT CHARACTER (Codepoint FFFD) und das tritt immer dann auf, wenn Konvertierungen nach UTF-8 in die Hose gegangen sind. pl

    1. Dein Code ist ein Chaos, das ist doch nicht Dein Ernst oder?

      Doch. Wenn ich ihn hier ohne Test-Zeilen ausliefere, dann wird das Problem nicht klar. Dies steht wirklich im Programm und zeigt nicht den Inhalt von $row['beschreibung']:

          $band_name = '';
          $band_start_pos = mb_strpos( $row['beschreibung'], '#' );  // erstes Zeichen #
          if ( $band_start_pos !== FALSE ) {
      
            $band_end_pos = mb_strpos( $row['beschreibung'], '#', $band_start_pos +1 );  // zweites Zeichen #
            if ( $band_end_pos !== FALSE ) {
              $band_name = mb_substr( $row['beschreibung'], $band_start_pos +1, $band_end_pos -$band_start_pos -1 );
              $band_search  = array( "[a]", "[@]", "[/a]", "'" );
              $band_replace = array( "<a href='", "'>", "</a>", "" );
              $band_name = str_replace( $band_search, $band_replace, $band_name );
            }
          }
      

      Außerdem vermute ich auch in der Vorgeschichte/Erhebung Deiner Daten chaotische Verhältnisse, denn

      > Shakin�
      

      Logisch. Wenn mir alles klar wäre, müsste ich hier nicht fragen.

      Ich habe einen Verdacht. Da das Hochkomma ' in PHP ja auch Feldbegrenzer ist, könnte es in den Tiefen der PHP-Programme umgesetzt worden sein. Hier eine andere Stelle:

      $firma = htmlspecialchars($treffer['benennung'],ENT_QUOTES);  // ' wird zu &#039; oder &apos;
      

      Aber egal, wo ich nachschaue (mein erzeugter HTML-Quellcode, phpMyAdmin), in den Daten finde ich immer das Hochkamma. Möglich, dass meine Browser mir das nur vorgaukeln.

      1. Habe den Fehler gefunden.

        Für die Anzeige wird der String in einem php include aufbereitet und das Hochkomma wird &#039;

        Dummerweise lief die Aufbereitung vor meinen neuen PHP-Zeilen. Jetzt habe ich die Reihenfolge umgedreht. Alles okay.

        Danke für eure Mitwirkung.

        1. hi lieber Kollege ;)

          Komodo Edit oder TextPad sind Editoren, mit denen kannst Du Kommandos ausführen. Entweder übers menü oder per ShortCut. Z.B. mit [STRG]+[1] die php.exe aufrufen mit der in den Editor geladenen Datei als Argument ... und das Ergebnis wird in einem neuen Editor-Tab ausgegeben.

          TexTPad ist so geil, das springt auf die Zeile, falls die Ausgabe einen Fehler wirft und doppelt auf die FM geklickt wird. Ggf. wird dazu die includierte geöffnet, das erledigt TextPad gleich mit.

          Entwickeln, Testen, alles in einem, ohne die Hand von der Tastatur nehmen zu müssen. Vor Allem siehst Du unverfälscht das was rein und das was raus geht, von wegen Entities ... ;)

          Na, dann machs mal gut, Grüße nach GG.

      2. Tach!

        Wenn ich ihn [den Code] hier ohne Test-Zeilen ausliefere, dann wird das Problem nicht klar.

        Das Problem wurde auch mit den Test-Zeilen nicht klar, weil es mit diesen Testdaten gar nicht auftrat. Hast du denn überhaupt nicht geprüft, ob diese Testdaten denselben Fehler bringen? Anscheinend nicht, denn dann wäre dir früher aufgefallen, dass PHP hier keine Schuld hat.

        Ich habe einen Verdacht. Da das Hochkomma ' in PHP ja auch Feldbegrenzer ist, könnte es in den Tiefen der PHP-Programme umgesetzt worden sein.

        Nein, Code ist Code und Daten sind Daten. Sonderzeichen in Stringliteralen im Code werden vom Parser weginterpretiert. Intern arbeitet PHP mit Rohdaten. Auch wenn Daten vom DBMS kommen, sind das Rohdaten. Es gibt keine Probleme mit der generellen Verarbeitbarkeit bestimmter Zeichen oder Bytewerte.

        Aber egal, wo ich nachschaue (mein erzeugter HTML-Quellcode, phpMyAdmin), in den Daten finde ich immer das Hochkamma. Möglich, dass meine Browser mir das nur vorgaukeln.

        Wenn du solche Probleme hast, dann solltest du direkt an Ort und Stelle nachschauen und dann rückwärts gehen, bis du die Quelle/Ursache gefunden hast. Die wichtigsten Hilfsmittel dazu sind schon so oft hier im Forum genannt worden ...

        var_dump() nimmt man am besten für Kontrollausgaben, nicht irgendwelche echo-Konstrukte.

        Für vermutete Zeichenkodierungsprobleme gibt es kein direktes Hilfsmittel. bin2hex() liefert von allem die Bytewert, ist aber schwer auseinanderzuklamüsern. urlencode() ist nicht dafür gedacht, lässt sich aber gut verwenden, weil es die unwichtigen Buchstaben und Ziffern a-zA-Z0-9 im Klartext lässt und man so die eigentlich interessanten Stellen besser findet.

        Diese beiden Hilfsmittel sollten an prominenter Stelle in deinem PHP-Programmierer-Werkzeugkasten hängen.

        dedlfix.