Menu

substr() w PHP: wycinanie fragmentu stringa

substr($string, $offset, $length) zwraca fragment stringa. Poznaj ujemne offsety, pobieranie pierwszych lub ostatnich znaków, mb_substr dla polskiego, japońskiego i innego tekstu UTF-8, substr_count i skracanie tekstu z wielokropkiem.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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
  • $offset to miejsce startu. 0 to pierwszy znak. Wartość ujemna liczy od końca.
  • $length to 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ń.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ