substr($string, $offset, $length) liefert den Teil von $string, der an Position $offset beginnt (ab 0 gezählt) und $length Zeichen lang ist. substr('Hello world', 0, 5) liefert "Hello". Lass $length weg, um alles bis zum Ende zu bekommen.
substr() zählt Bytes. Bei englischem Text ist das dasselbe wie Zeichen, aber nicht bei Japanisch, Chinesisch, Emoji oder Buchstaben mit Akzent oder Umlaut. Dafür verwendest du mb_substr(), unten gezeigt.
Syntax
substr(string $string, int $offset, ?int $length = null): string
$offsetist, wo es beginnt.0ist das erste Zeichen. Ein negativer Wert zählt vom Ende.$lengthist, wie viele Bytes genommen werden (in reinem ASCII-Text ist ein Byte ein Zeichen). Ein negativer Wert lässt so viele am Ende weg.null(oder weglassen) bedeutet „bis zum Ende“.
Negativer Offset und negative Länge: vom Ende her arbeiten
Ein negativer $offset beginnt am Ende des Strings zu zählen, also ist -1 das letzte Zeichen. Eine negative $length hört so viele Zeichen vor dem Ende auf.
substr($s, 0, -1) ist der übliche Weg, das letzte Zeichen zu entfernen, zum Beispiel ein Komma am Ende, das eine Schleife hinterlassen hat.
Das erste oder letzte Zeichen holen
Für ein einzelnes Byte kannst du den String auch direkt indizieren. $s[0] ist das erste Zeichen und seit PHP 7.1 ist $s[-1] das letzte.
Eine Position zu indizieren, die nicht existiert, gibt eine Warnung aus, während substr() einfach einen leeren String liefert. Wenn der String leer sein könnte, nimm lieber substr().
Außerhalb des Bereichs: ein leerer String, nicht false
Liegt $offset hinter dem Ende des Strings, liefert substr() in PHP 8 "". In PHP 7 lieferte es false, also funktioniert alter Code, der auf === false prüft, nicht mehr.
Japanischer Text: mb_substr verwenden
UTF-8 speichert Kana und gängige Kanji in je 3 Bytes (seltene Kanji wie 𠮷 und Emoji brauchen 4). substr() zählt Bytes, also liefert substr('こんにちは', 0, 3) nur こ, und eine Länge, die nicht auf einer Zeichengrenze endet, schneidet ein Zeichen in der Mitte durch und erzeugt kaputten Text. mb_substr() nimmt dieselben Argumente und zählt Zeichen.
Dasselbe gilt für Emoji und Buchstaben mit Akzent wie é. Zeichen zählt man mit mb_strlen(); siehe strlen() zu Bytes und Zeichen.
Text mit Auslassungspunkten kürzen
Einen langen Titel für eine Liste oder Karte zu kürzen ist der häufigste echte Einsatz von substr(). Verwende mb_substr(), damit ein japanischer Titel nie mitten im Zeichen abgeschnitten wird, und füge ... nur hinzu, wenn du tatsächlich gekürzt hast.
mb_strimwidth($text, 0, $width, '...') macht dasselbe nach Anzeigebreite, wobei ein vollbreites japanisches Zeichen als 2 Spalten und ein lateinischer Buchstabe als 1 zählt. Das passt zu Layouts mit fester Breite.
Einen Teilstring mit substr_count zählen
substr_count($haystack, $needle) liefert, wie oft $needle vorkommt. Es unterscheidet Groß- und Kleinschreibung und zählt keine überlappenden Treffer.
substr mit strpos: Text vor oder nach einem Zeichen
Kombiniere substr() mit strpos(), um an einem Zeichen zu schneiden, dessen Position du vorher nicht kennst, etwa dem @ in einer E-Mail-Adresse:
Prüfe, dass strpos() nicht false geliefert hat, bevor du das Ergebnis verwendest: Fehlt das Zeichen, wird false ohne Warnung als 0 behandelt, also liefert substr('nobody', 0, $at) den Wert "" und substr('nobody', $at + 1) den Wert "obody".
Häufig gestellte Fragen
Wie bekomme ich in PHP die letzten Zeichen eines Strings?
Mit einem negativen Offset: substr($s, -3) liefert die letzten 3 Zeichen. Für Text, der Japanisch oder andere Multibyte-Zeichen enthalten kann, verwendest du mb_substr($s, -3).
Was ist der Unterschied zwischen substr und mb_substr?
substr() zählt Bytes und mb_substr() zählt Zeichen. In UTF-8 brauchen Kana und gängige Kanji je 3 Bytes, also schneidet substr('日本語', 0, 2) ein Zeichen in der Mitte durch, während mb_substr('日本語', 0, 2) "日本" liefert.
Was liefert substr, wenn der Start hinter dem Ende des Strings liegt?
Einen leeren String. Seit PHP 8.0 liefert substr('abc', 5) den Wert ""; PHP 7 lieferte false.
Wie entferne ich in PHP das letzte Zeichen eines Strings?
substr($s, 0, -1) liefert alles außer dem letzten Byte. Verwende mb_substr($s, 0, -1) für Multibyte-Text oder rtrim($s, ','), wenn du nur ein bestimmtes Zeichen am Ende entfernen willst.
Wie zähle ich in PHP, wie oft ein Teilstring vorkommt?
Mit substr_count($haystack, $needle): substr_count('banana', 'an') liefert 2. Es unterscheidet Groß- und Kleinschreibung und zählt keine überlappenden Treffer.