Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit strpos()

Einklappen

Neue Werbung 2019

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

  • Problem mit strpos()

    Hallo, bin neu hier und habe gleich ein Problem mit "strpos()":

    Ich möchte aus einer Variablen, die einen String enthält prüfen, ob "AHC" darin vorkommt. Und wenn ja, dann soll er diesen String in eine andere Variable kopieren. Funktioniert mit strpos soweit auch gut, außer wenn AHC gleich ganz am Anfang steht.

    Sobald ein anderes Zeichen davor steht, funktioniert es wieder.

    Ich kanns mir nicht erklären. Ich hoffe das Problem ist verständlich...Weiß jemand einen Rat?

    Grüße,
    Roman


  • #2
    Das liegt wohl an deiner Überprüfung des Rückgabewertes von strpos(). Das Problem liegt darin, dass bei einer Überprüfung à la
    PHP-Code:
    if(strpos($string,'AHC')==false) { ... } 
    der Rückgabewert 0 (der aussagt, dass der gesuchte Teilstring genau am Anfang steht) von PHP als false interpretiert wird. Deshalb muss man === (identisch, sprich nicht nur der Wert sondern auch der Variablentyp) verwenden.

    Kommentar


    • #3
      Hm, versteh ich noch nicht ganz...

      Beispiel:
      PHP-Code:
      $buchung "ahc-789008";
       if ((
      strpos($buchung"AHC") === true) || (strpos($buchung"ahc") === true))
       {
       
      $oID $buchung;
      $buchung NULL;
       }
                        
       if (
      $oID != "")
       {
       
      $fontcolor "green";
       } 
      So schreibt der mir jetzt in $oID gar nichts mehr rein (oder löscht es sofort wieder!?).

      Mit zwei "==" schreibt er mir zumindest die richtigen rein, wenn ahc nicht an erster Position anfängt.

      Schwierig zu erklären...habe ich irgendwo einen Denkfehler?

      Kommentar


      • #4
        Wieso vergleichst du mit "true"? strpos gibt dir niemals true zurück, sondern entweder false oder die Position, wo der String zu finden ist als Integer. Damit macht der Vergleich mit true definitiv keinen Sinn. Du kannst entweder mit
        PHP-Code:
         !(strpos(....)===false
        (ich bin mir nie sicher, ob es "!==" als "ungleich identisch" gibt), oder du überprüfst es mit der Funktion is_int().

        EDIT: Hab grade nochmals nachgeschaut !== existiert => ich würde folgendes verwenden:
        PHP-Code:
        if(strpos(....) !== false || ....) 

        Kommentar


        • #5
          Du hast es ja auch mit true gemacht...

          eigentlich ganz Simpel. Wenn du eine === true Abfrage machst und strpos gibt dir Position x zurück, dann ist das eben durch === nicht mehr das gleiche wie true.

          Du kannst in deinem Fall auch if(is_numeric(strpos... benutzen, der liefert dir das was du haben willst

          Kommentar


          • #6
            Habe es jetzt mit Eurer hilfe hinbekommen. Danke Euch beiden!!

            Ich meld mich sicher heute nochmal

            tschöö

            Kommentar


            • #7
              Also ich würde das nicht mit strpos lösen sondern per regülären ausdruck und preg_match() ...
              strpos ist m.E. nicht die richtige Funktion, auch wenn der Ansatz funktioniert, wobei man ja die probleme hier im thread schon sieht.

              Kommentar


              • #8
                Ich finde, dass nichts gegen strpos einzuwenden ist. Natürlich ist es nicht genau die richtige Funktion, aber wofür reguläre Ausdrücke verwenden, wenn man den exakten String kennt?

                Diese Aussage ist jetzt reine Spekulation, aber ich kann mir vorstellen, dass strpos schneller ist als ereg(i) oder preg_match (obwohl die preg-Funktionen schon ziemlich mächtig sind). Doof an strpos ist nur, dass es nicht case insensitive verwendet werden kann. Die beiden Aufrufe könnten natürlich wieder langsamer sein....

                Aber die meisten "Anfänger" sind durch reguläre Ausdrücke viel mehr verwirrt, als dass sie sie weiterbringen würden. Ich habe strpos auch schon für solche Zwecke eingesetzt und es hat definitiv keine Nachteile, sofern man mit der Rückgabe zurecht kommt

                Kommentar


                • #9
                  Zitat von Montellese Beitrag anzeigen
                  Doof an strpos ist nur, dass es nicht case insensitive verwendet werden kann. Die beiden Aufrufe könnten natürlich wieder langsamer sein....
                  dafür gibts stripos()

                  Kommentar


                  • #10
                    Sorry, aber ich finde eben, dass hier verschiedene Funktionen irgendwie zusammengezimmert werden um ein Ergebnis zu erzielen, das ein einfacher regulärer Ausdruck mit preg_match() sofort und vorallem transparent und korrekt liefert.

                    Vorschläge wie if(is_numeric(strpos... zeigen doch niemandem wie man zielgerichtet Problemlösungen herbeiführt sondern wie man sich irgendwie über Umwege eine Lösung herbeiführen kann, die auch funktioniert keine Frage, aber doch mehrere Probleme birgt.

                    Das grösste Problem sehe ich hier, dass man einen code erstellt, von dem nicht ersichtlich wird was er genau macht. Die Position eines Strings finden, um damit festzustellen ob der String vorhanden ist ist nunmal durch die Brust ins Knie.

                    Kommentar


                    • #11
                      Und was machen reguläre Ausdrücke in diesem Fall besser?
                      is_numeric(strpos()) finde ich hier auch nicht gut. Aber der simple Vergleich strpos()!==false zeigt deutlich, was der Code machen soll.

                      Kommentar


                      • #12
                        @cycap: Jo hassu natürlich recht

                        Wie gesagt finde ich eine Benutzung von preg-Funktion in so einem Fall à la
                        PHP-Code:
                        if(preg_match('/ahc/i',$string)) 
                        irgendwie einfach Verschwendung. preg_match ist speziell für den Einsatz mit regulären Ausdrücken gedacht, aber /ahc/i ist definitiv ein ziemlich sinnfreier regulärer Ausdruck bzw eben nicht wirklich ein regulärer Ausdruck. Damit dürfte man nach deiner Argumentation preg_match auch nicht verwenden.

                        Aber ich bin der Meinung, dass das Geschmackssache ist und jeder so machen soll, wie er will.

                        Kommentar


                        • #13
                          [OT]
                          Man kann schliesslich auch mit Kanonen auf Spatzenjagd gehen
                          Gruss
                          L

                          Kommentar

                          Lädt...
                          X