Immer wieder wird in Foren oder im IRC strpos() empfohlen um zu prüfen ob etwas in einem String vorkommt. Sehen wir uns einmal an warum substr_count() besser dazu geeignet ist:

$str = "ich bin ein teststring";
 
if (strpos($str, "bin")) { // liefert die Position zurück, Integer: 4
	// Dieser Block wird ausgeführt.
} else {
 
}

Funktioniert ganz gut. Doch was passiert wenn wir nach “ich” suchen?

$str = "ich bin ein teststring";
 
if (strpos($str, "ich")) { // In dem Fall Integer: 0
 
} else {
	// Dieser Block wird ausgeführt.
}

Was ist passiert? Wir sehen im zweiten Beispiel, dass der else-Teil ausgeführt wird obwohl ein Vorkomniss gefunden wurde. Das liegt ganz einfach daran, dass strpos() eine Positionsangabe zurückliefert und wie wir alle wissen ist 0 für den Computer die erste Zahl. Da der Integerwert 0 aber auch für bool(false) steht, springt er in den else-Teil. Wir müssen bei strpos() also nicht nur den Wert sondern auch den Typ prüfen denn diese Funktion kann je nach Ergebniss 0 oder false zurückliefern was nicht das gleiche ist. Korrekt wäre also:

$str = "ich bin ein teststring";
 
if (strpos($str, "ich") !== false) { // Hier auch Integer: 0
	// Dieser Block wird ausgeführt.
} else {
 
}

Fazit: Wenn man einfach nur wissen will ob sich etwas in einem String befindet, sollte man substr_count() benutzen. Wer jedoch die Position braucht oder Gewicht auf (meiner Meinung nach vernachlässigbarer) Performance legt kann auch strpos() nutzen, sollte allerdings nicht vergessen den Typ der Rückgabe zu prüfen.