mb_substr

mb_substr($string, $start, $length, $encoding)

Zwraca część ciągu jak substr(), ale liczy znaki, a nie bajty. W UTF-8 polska litera zajmuje dwa bajty, więc substr() może ją przeciąć w połowie. Dla tekstu z polskimi znakami właściwym wyborem jest więc mb_substr.

Parametry

  • $string – ciąg wejściowy.
  • $start – pozycja, od której zwracać (liczona od zera). Liczba ujemna = liczba znaków od końca.
  • $length – opcjonalny. Ile znaków zwrócić; liczba ujemna = ile znaków pominąć na końcu. Bez niego (albo z null) zwraca wszystko do końca.
  • $encoding – opcjonalny, domyślnie wewnętrzne kodowanie PHP, zwykle UTF-8.

Przykłady

echo mb_substr("Zażółć gęślą jaźń", 0, 4); // Zażó
echo mb_substr("Zażółć gęślą jaźń", -4); // jaźń
echo mb_substr("Zażółć gęślą jaźń", 7, 3); // gęś
// długość w znakach i w bajtach
echo mb_strlen("Zażółć gęślą jaźń"); // 17
echo strlen("Zażółć gęślą jaźń"); // 26
// skracanie tekstu do określonej liczby znaków łącznie z wielokropkiem
function shorten($text, $max) {
  if (mb_strlen($text) <= $max) return $text;
  return rtrim(mb_substr($text, 0, $max - 1)) . "…";
}
echo shorten("Żurawina jest zdrowa", 10); // Żurawina…
echo shorten("Krótko", 10); // Krótko
// kolejne funkcje mb_ do pracy według znaków
echo mb_strtoupper("łódź"); // ŁÓDŹ
echo implode("|", mb_str_split("Łódź")); // Ł|ó|d|ź

Na co uważać

  • Funkcje mb_ należą do rozszerzenia mbstring. Na zwykłym hostingu jest ono zwykle włączone, w przeciwnym razie funkcja nie istnieje i skrypt kończy się błędem.
  • Litera przecięta przez substr() wyświetla się jako znak � i przy zapisie do bazy danych w kodowaniu UTF-8 może wywołać błąd. Wszędzie, gdzie tekst jest skracany lub dzielony, używaj mb_substr.
  • Do innych operacji na tekście są podobne funkcje: mb_strlen, mb_strpos, mb_strtolower, mb_strtoupper, mb_str_split (od PHP 7.4).
  • Długość kolumny bazy danych (VARCHAR(100)) jest w MySQL liczona w znakach, do sprawdzenia przed zapisem pasuje więc mb_strlen, a nie strlen.

Powiązane funkcje:
substr()
strlen()
strtolower()
mb_strlen()
mb_strcut()