Signatur
Beschreibung
mb_strstr() ist die multibyte-sichere Entsprechung von strstr(). Sie sucht das erste Vorkommen des Strings needle im String haystack und gibt entweder den Teil ab dem Treffer (inklusive needle) oder den Teil davor zurück – je nach Wert des Parameters before_needle.
Die Funktion ist besonders wichtig bei Texten in Mehrbytezeichensätzen wie UTF-8, Shift-JIS oder EUC-JP, da strstr() in solchen Fällen fehlerhafte Ergebnisse liefern kann, indem es Byte-Grenzen ignoriert und Zeichen zerschneidet.
Wenn before_needle auf true gesetzt wird, gibt die Funktion den Teil des Strings vor dem ersten Vorkommen von needle zurück (ohne needle selbst). Das ist praktisch, um etwa Präfixe, Benutzernamen oder Domänen aus zusammengesetzten Strings zu extrahieren.
Wird needle nicht in haystack gefunden, gibt die Funktion false zurück. Der Vergleich ist case-sensitiv; für eine Suche ohne Beachtung der Groß-/Kleinschreibung steht mb_stristr() zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $haystack Pflicht | string | Der Eingabe-String, in dem gesucht wird. | |
| $needle Pflicht | string | Der gesuchte Teilstring. Anders als bei strstr() vor PHP 8.0 muss needle immer ein String sein. |
|
| $before_needle | bool | false | Wenn true, wird der Teil des Strings vor dem ersten Vorkommen von needle zurückgegeben (ohne needle). Standardmäßig false: Es wird der Teil ab dem ersten Vorkommen (inklusive needle) zurückgegeben. |
| $encoding | string|null | null | Die zu verwendende Zeichenkodierung (z. B. 'UTF-8'). Bei null wird die intern gesetzte Kodierung verwendet (mb_internal_encoding()). |
Rückgabewert
needle (inklusive) oder den Teil davor, abhängig von before_needle. Wird needle nicht gefunden, wird false zurückgegeben.Beispiele
Domain aus einer E-Mail-Adresse extrahieren
<?php
$email = 'benutzer@example.com';
// Teil ab '@' (inklusive '@')
$domain_mit_at = mb_strstr($email, '@');
echo $domain_mit_at; // @example.com
// Nur die Domain (ohne '@')
$domain = ltrim(mb_strstr($email, '@'), '@');
echo $domain; // example.com
// Benutzername (Teil vor '@')
$benutzername = mb_strstr($email, '@', before_needle: true);
echo $benutzername; // benutzer
Suche in einem UTF-8-String mit Sonderzeichen
<?php
$text = 'Füße sind größer als Hände';
// Suche nach 'größer'
$result = mb_strstr($text, 'größer', encoding: 'UTF-8');
var_dump($result);
// Suche nach einem nicht vorhandenen Teilstring
$result_fehlt = mb_strstr($text, 'kleiner', encoding: 'UTF-8');
var_dump($result_fehlt);
// Teil vor dem Treffer
$vor_treffer = mb_strstr($text, 'größer', before_needle: true, encoding: 'UTF-8');
var_dump($vor_treffer);
Dateiendung aus einem Dateinamen extrahieren
<?php
$dateiname = 'dokument.bericht.pdf';
// Letzten Punkt und alles dahinter finden
// mb_strrchr wäre ideal, hier Demo mit mb_strstr für erstes Vorkommen
$erweiterung_ab_erstem_punkt = mb_strstr($dateiname, '.');
echo $erweiterung_ab_erstem_punkt . PHP_EOL; // .bericht.pdf
$name_vor_erstem_punkt = mb_strstr($dateiname, '.', before_needle: true);
echo $name_vor_erstem_punkt . PHP_EOL; // dokument
// Wichtig · Fallstricke
Rückgabewert prüfen: Da mb_strstr() bei einem nicht gefundenen needle false zurückgibt, sollte der Rückgabewert immer mit === false geprüft werden, um Verwechslungen mit einem leeren String zu vermeiden.
Kodierung: Wird kein encoding angegeben, gilt die mit mb_internal_encoding() gesetzte Kodierung. Für konsistentes Verhalten empfiehlt es sich, die Kodierung explizit anzugeben.
Für das letzte Vorkommen: Um das letzte Vorkommen eines Teilstrings zu finden, steht mb_strrchr() zur Verfügung. Für eine Suche ohne Beachtung der Groß-/Kleinschreibung bietet sich mb_stristr() an.