Signatur
Beschreibung
mb_stripos() sucht in der Zeichenkette $haystack nach dem ersten Vorkommen von $needle und gibt dessen Zeichenposition (in Zeichen, nicht in Bytes) zurück. Der Vergleich erfolgt ohne Beachtung der Groß-/Kleinschreibung und ist dabei vollständig Multibyte-sicher, d. h. er berücksichtigt korrekt Zeichen wie Umlaute (ä, ö, ü), Akzente oder andere Unicode-Zeichen.
Im Gegensatz zu stripos(), das nur Single-Byte-Zeichensätze korrekt verarbeitet, funktioniert mb_stripos() zuverlässig mit UTF-8 und anderen Multibyte-Kodierungen. Dies ist besonders wichtig, wenn Zeichenketten mit Umlauten oder anderen Nicht-ASCII-Zeichen verglichen werden.
Der optionale Parameter $offset gibt an, ab welcher Zeichenposition die Suche beginnen soll. Ein negativer Offset sucht ab dem entsprechenden Zeichen vom Ende des Strings. Mit dem Parameter $encoding lässt sich die gewünschte Zeichenkodierung explizit angeben; wird er weggelassen, wird die interne Kodierung (gesetzt über mb_internal_encoding()) verwendet.
Die Funktion eignet sich hervorragend für Suchanfragen, Filterungen oder Prüfungen in mehrsprachigen Anwendungen, bei denen Groß- und Kleinschreibung keine Rolle spielt, z. B. beim Durchsuchen von Benutzereingaben nach Schlüsselwörtern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $haystack Pflicht | string | Die Zeichenkette, in der gesucht wird. | |
| $needle Pflicht | string | Der Teilstring, nach dem gesucht wird. Die Suche ist nicht case-sensitive. | |
| $offset | int | 0 | Startposition (in Zeichen) für die Suche. Ein positiver Wert beginnt ab dieser Position vom Anfang, ein negativer Wert vom Ende des Strings. Standard ist 0. |
| $encoding | ?string | null | Die zu verwendende Zeichenkodierung, z. B. 'UTF-8'. Wird null übergeben oder der Parameter weggelassen, wird die interne Multibyte-Kodierung verwendet. |
Rückgabewert
$needle in $haystack zurück. Wenn $needle nicht gefunden wird, wird false zurückgegeben. Achtung: Da Position 0 ebenfalls einen Treffer bedeutet, muss der Rückgabewert mit === auf false geprüft werden.Beispiele
Einfache Suche ohne Beachtung der Groß-/Kleinschreibung
<?php
$text = 'Hallo Welt, willkommen in der PHP-Welt!';
$suche = 'welt';
$position = mb_stripos($text, $suche, 0, 'UTF-8');
if ($position !== false) {
echo "Gefunden an Position: " . $position;
} else {
echo "Nicht gefunden.";
}
Suche mit Umlauten (Multibyte-Vorteil gegenüber stripos)
<?php
$text = 'Die Ärzte sind die beste Band Deutschlands.';
$suche = 'ärzte';
// mb_stripos korrekt mit UTF-8
$pos_mb = mb_stripos($text, $suche, 0, 'UTF-8');
echo "mb_stripos: " . var_export($pos_mb, true) . "\n";
// stripos kann bei Multibyte-Zeichen falsche oder inkonsistente Ergebnisse liefern
$pos_single = stripos($text, $suche);
echo "stripos: " . var_export($pos_single, true) . "\n";
Suche mit negativem Offset
<?php
$text = 'Apfel, Birne, Apfel, Kirsche';
$suche = 'apfel';
// Suche beginnt ab dem 10. Zeichen vom Ende
$position = mb_stripos($text, $suche, -15, 'UTF-8');
if ($position !== false) {
echo "Letztes 'Apfel' gefunden an Position: " . $position;
} else {
echo "Nicht gefunden.";
}
Eingaben auf verbotene Schlüsselwörter prüfen
<?php
$verboten = ['spam', 'werbung', 'klick hier'];
$nutzereingabe = 'Schau dir diese tolle Werbung an!';
foreach ($verboten as $wort) {
if (mb_stripos($nutzereingabe, $wort, 0, 'UTF-8') !== false) {
echo "Verbotenes Wort gefunden: '" . $wort . "'";
break;
}
}
// Wichtig · Fallstricke
Rückgabewert-Prüfung: Da die Funktion 0 zurückgibt, wenn $needle am Anfang von $haystack steht, und false, wenn nichts gefunden wurde, muss der Vergleich zwingend mit dem strikten Operator === erfolgen. Ein loser Vergleich mit == würde 0 und false als gleich behandeln.
Kodierung: Es wird empfohlen, die Kodierung immer explizit zu übergeben ('UTF-8'), anstatt sich auf die intern gesetzte Kodierung zu verlassen, um unerwartetes Verhalten in verschiedenen Umgebungen zu vermeiden.
Performance: Bei sehr häufigen Aufrufen in Schleifen kann es performanter sein, den Haystack vorab in Kleinbuchstaben umzuwandeln (z. B. mit mb_strtolower()) und dann mb_strpos() zu verwenden.