• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage zu strpos

Tomm

Mitglied
Seltsam, wenn ich diesen Code eingeb

PHP:
if (strpos($datei,"gesuchtertext")===true) {echo.....;}

funktioniert es nicht,aber dieser

PHP:
if (strpos($datei,"gesuchtertext")!==false) {echo.....;}

funktioniert :shock:
Hab ewig gebraucht ,aber es geht, trotzdem sehr seltsam
oder weiss jemand ,was da falsch ist ??
 
PHP: strpos - Manual

strpos gibt nicht true zurück, die zweite variante klappt, da strpos ein false zurückgibt, wenn needle nicht gefunden wird, ist aber nichjt 100% astrein
 
PHP:
if (true === !!strpos($datei, "gesuchtertext")) {}
sollte klappen. !! wandelt schnell in Boolean um.
 
PHP:
 if (strpos($datei,"gesuchtertext")!==false) {echo.....;}

Das ist genau richtig.

strpos gibt genau dann false zurück, wenn der Suchwert nicht im String enthalten ist. (Das heißt, wenn eine Prüfung auf !== false wahr ist, ist der Suchwert enthalten.) strpos gibt nie true zurück (deshalb klappt === true nicht ohne weiteres). strpos gibt zudem 0 zurück, wenn der gesuchte String am Stringanfang steht, weshalb eine Prüfung mit == true nicht exakt ist, denn nur Zahlen ungleich 0 sind == true.

Ist völlig logisch, aber auf den ersten Blick etwas verwirrend. Ich schätze mal, diese Erklärung hier macht das auch nicht besser. ;)

- PHP: PHP type comparison tables - Manual
 
Nur mal der Schönheit halber. Würde das nicht auch funktionieren?
PHP:
if (strpos($datei,"gesuchtertext")) {echo.....;}

Solang irgend etwas ausser false zurück kommt müsste er doch etwas ausgeben oder?
 
@Gilles: Siehe zweites Beispiel:

PHP:
<?php

// strpos

$haystack = 'Hallo Welt';
$needle   = 'Welt';

var_dump((bool) strpos($haystack, $needle));    // bool(true)
var_dump(strpos($haystack, $needle) !== false); // bool(true)



// strpos, Vorsicht: Suchbegriff am Stringanfang (Offset 0)

$haystack = 'Hallo Welt';
$needle   = 'Hallo';

var_dump((bool) strpos($haystack, $needle));    // bool(false) <-- (!)
var_dump(strpos($haystack, $needle) !== false); // bool(true)



// strstr/stristr, Cornercase (jetzt wird es spitzfindig)

$haystack = '0';
$needle   = '0';

var_dump((bool) strstr($haystack, $needle));    // bool(false) <-- (!)
var_dump(strstr($haystack, $needle) !== false); // bool(true)

strstr/stristr ohne !== false dürfte in sämtlichen anderen Fällen aber das erwartete Ergebnis liefern.
 
Zurück
Oben