substr($string, $offset, $length) zwraca fragment $string, który zaczyna się na pozycji $offset (licząc od 0) i ma $length znaków. substr('Hello world', 0, 5) zwraca "Hello". Pomiń $length, aby dostać wszystko do końca.
substr() liczy bajty. W tekście angielskim to to samo co znaki, ale nie w japońskim, chińskim, przy emoji czy literach z akcentami i polskich znakach. Dla nich użyj mb_substr(), pokazanego niżej.
Składnia
substr(string $string, int $offset, ?int $length = null): string
$offsetto miejsce startu.0to pierwszy znak. Wartość ujemna liczy od końca.$lengthto liczba bajtów do pobrania (w zwykłym tekście ASCII jeden bajt to jeden znak). Wartość ujemna pomija tyle znaków na końcu.null(albo pominięcie) oznacza „do końca”.
Ujemny offset i długość: praca od końca
Ujemny $offset zaczyna liczyć od końca stringa, więc -1 to ostatni znak. Ujemna $length zatrzymuje się tyle znaków przed końcem.
substr($s, 0, -1) to zwykły sposób na usunięcie ostatniego znaku, na przykład przecinka pozostawionego przez pętlę.
Pierwszy lub ostatni znak
Dla pojedynczego bajtu możesz też indeksować string bezpośrednio. $s[0] to pierwszy znak, a od PHP 7.1 $s[-1] to ostatni.
Indeksowanie nieistniejącej pozycji wypisuje ostrzeżenie, a substr() po prostu zwraca pusty string. Jeśli string może być pusty, wybierz substr().
Poza zakresem: pusty string, a nie false
Jeśli $offset jest za końcem stringa, substr() w PHP 8 zwraca "". W PHP 7 zwracało false, więc stary kod sprawdzający === false już nie działa.
Tekst japoński: użyj mb_substr
UTF-8 zapisuje kana i popularne kanji na 3 bajtach każde (rzadkie kanji, takie jak 𠮷, i emoji zajmują 4). substr() liczy bajty, więc substr('こんにちは', 0, 3) zwraca tylko こ, a długość, która nie trafia w granicę znaku, przecina znak na pół i daje uszkodzony tekst. mb_substr() przyjmuje te same argumenty i liczy znaki.
To samo dotyczy emoji i liter z akcentami, takich jak é, oraz polskich liter, takich jak ą czy ż. Liczbę znaków podaje mb_strlen(); różnicę między bajtami a znakami opisuje strona strlen().
Skracanie tekstu z wielokropkiem
Przycinanie długiego tytułu do listy lub karty to najczęstsze praktyczne użycie substr(). Użyj mb_substr(), żeby tytuł nigdy nie został przecięty w środku znaku, i dodawaj ... tylko wtedy, gdy faktycznie coś skróciłeś.
mb_strimwidth($text, 0, $width, '...') robi to samo według szerokości wyświetlania, w której japoński znak pełnej szerokości liczy się jako 2 kolumny, a litera łacińska jako 1. Pasuje do układów o stałej szerokości.
Liczenie podciągu przez substr_count
substr_count($haystack, $needle) zwraca, ile razy występuje $needle. Rozróżnia wielkość liter i nie liczy nakładających się dopasowań.
substr ze strpos: tekst przed lub po znaku
Połącz substr() ze strpos(), aby ciąć przy znaku, którego pozycji nie znasz z góry, na przykład przy @ w adresie e-mail:
Zanim użyjesz wyniku strpos(), sprawdź, czy nie zwróciło false: jeśli znaku brakuje, false jest traktowane jak 0 bez ostrzeżenia, więc substr('nobody', 0, $at) zwraca "", a substr('nobody', $at + 1) zwraca "obody".
Najczęściej zadawane pytania
Jak pobrać ostatnie znaki stringa w PHP?
Użyj ujemnego offsetu: substr($s, -3) zwraca ostatnie 3 znaki. Dla tekstu, który może zawierać polskie, japońskie lub inne znaki wielobajtowe, użyj mb_substr($s, -3).
Czym różni się substr od mb_substr?
substr() liczy bajty, a mb_substr() znaki. W UTF-8 kana i popularne kanji zajmują po 3 bajty, więc substr('日本語', 0, 2) przecina znak na pół, a mb_substr('日本語', 0, 2) zwraca "日本".
Co zwraca substr, gdy start jest za końcem stringa?
Pusty string. Od PHP 8.0 substr('abc', 5) zwraca ""; PHP 7 zwracało false.
Jak usunąć ostatni znak stringa w PHP?
substr($s, 0, -1) zwraca wszystko oprócz ostatniego bajtu. Dla tekstu wielobajtowego użyj mb_substr($s, 0, -1), a jeśli chcesz usunąć tylko konkretny znak na końcu, rtrim($s, ',').
Jak policzyć, ile razy podciąg występuje w PHP?
substr_count($haystack, $needle): substr_count('banana', 'an') zwraca 2. Rozróżnia wielkość liter i nie liczy nakładających się dopasowań.