Start · Sprachen · PHP · Referenz · mb_stripos

mb_stripos

Funktion

Findet die Position des ersten Vorkommens eines Teilstrings in einem String, ohne Groß-/Kleinschreibung zu beachten (Multibyte-sicher).

seit PHP 5.2.0 Kategorie: string

Signatur

mb_stripos(string $haystack, string $needle, int $offset = 0, ?string $encoding = null): int|false

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

Typ
int|false
Beschreibung
Gibt die Zeichenposition (nullbasiert) des ersten Vorkommens von $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.";
}
Gefunden an Position: 6

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";
mb_stripos: 4 stripos: 4

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.";
}
Letztes 'Apfel' gefunden an Position: 14

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;
    }
}
Verbotenes Wort gefunden: 'werbung'

// 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.