trim($string) zwraca string z usuniętymi białymi znakami z początku i końca: spacjami, tabulatorami, znakami nowej linii, powrotami karetki, bajtami NUL i tabulatorami pionowymi. ltrim() usuwa je tylko z początku, a rtrim() tylko z końca. Spacje w środku zostają.
Wynik var_dump() pokazuje długość każdego wyniku, dzięki czemu widać usunięte znaki. Przycinanie to pierwsza rzecz do zrobienia z większością wartości z formularza (wyjątkiem są hasła, zobacz koniec strony): użytkownik, który wpisze ada@example.com ze spacją na końcu, nadal powinien móc się zalogować.
Składnia
trim(string $string, string $characters = " \n\r\t\v\0"): string
ltrim(string $string, string $characters = " \n\r\t\v\0"): string
rtrim(string $string, string $characters = " \n\r\t\v\0"): string
trim() zwraca nowy string; nie zmienia przekazanej zmiennej.
Usuwanie wybranych znaków
Drugi argument zastępuje domyślną listę. Każdy znak z niej jest usuwany z końców, w dowolnej kolejności i dowolną liczbę razy. .. definiuje zakres, więc 'a..z' oznacza każdą małą literę.
Aby nadal usuwać też zwykłe białe znaki, dodaj je do listy: trim($s, " \n\r\t\v\0/").
Drugi argument to zbiór znaków, a nie string
trim() nie usuwa słowa ani sufiksu. Usuwa z obu końców dowolne z wymienionych znaków, dopóki nie trafi na znak spoza listy. Zaskakuje to osoby, które próbują usunąć rozszerzenie pliku:
Pierwsza linia usuwa też h na początku, bo h jest w zbiorze. Aby usunąć stały prefiks lub sufiks, użyj str_starts_with() albo str_ends_with() z substr(), albo str_replace(), jeśli ten tekst nie może pojawić się nigdzie indziej.
Usuwanie spacji pełnej szerokości (dane z Japonii)
Japońskie klawiatury często wstawiają spację ideograficzną (U+3000), na przykład wokół imienia wpisanego w formularzu. Nie ma jej na domyślnej liście trim, a podanie jej w drugim argumencie to pułapka: trim() działa bajt po bajcie, spacja to 3 bajty E3 80 80, a E3 jest też pierwszym bajtem każdego znaku hiragany i katakany, więc imię zaczynające się od takiego znaku traci jego pierwszy bajt. Użyj wyrażenia regularnego z modyfikatorem u:
\A i \z kotwiczą początek i koniec stringa. Z modyfikatorem u wzorzec \s pasuje do każdej spacji Unicode: białych znaków ASCII, spacji pełnej szerokości i twardej spacji (U+00A0), którą często przynosi kopiowanie ze stron WWW. Bez u \s pasuje tylko do białych znaków ASCII i spacja pełnej szerokości zostaje. PHP 8.4 dodaje do tego mb_trim(), mb_ltrim() i mb_rtrim(); w PHP 8.3 i starszych sposobem jest wyrażenie regularne.
Przycinanie każdej wartości w tablicy
array_map('trim', $array) przycina każdą wartość i zachowuje klucze. Typowy przypadek to lista rozdzielona przecinkami z pola tekstowego, podzielona przez explode():
Przycięcie wartości z formularza przed walidacją
Najpierw przytnij, potem sprawdź pusty string. Pole zawierające same spacje zostanie wtedy odrzucone jako puste. Uruchom ten blok, wpisz w formularzu imię otoczone spacjami i naciśnij Send: ten sam skrypt uruchomi się ponownie z wypełnionym $_POST.
Nie przycinaj haseł: spacja na końcu hasła jest jego częścią.
Najczęściej zadawane pytania
Co usuwa trim() w PHP?
Domyślnie z obu końców stringa: spacje, tabulatory (\t), znaki nowej linii (\n), powroty karetki (\r), bajty NUL (\0) i tabulatory pionowe (\v). Nigdy nie rusza środka stringa.
Czym różnią się trim, ltrim i rtrim?
trim() czyści oba końce, ltrim() tylko początek, a rtrim() tylko koniec. Wszystkie trzy przyjmują tę samą opcjonalną listę znaków do usunięcia.
Dlaczego trim() nie usuwa japońskiej spacji pełnej szerokości?
Spacja pełnej szerokości (U+3000) nie jest na domyślnej liście trim i zajmuje w UTF-8 3 bajty. Użyj preg_replace('/\A\s+|\s+\z/u', '', $s): z modyfikatorem u wzorzec \s pasuje do każdej spacji Unicode, także U+3000. PHP 8.4 dodaje mb_trim(), które też ją usuwa.
Jak usunąć ostatni przecinek ze stringa w PHP?
rtrim($s, ',') usuwa każdy przecinek na końcu. Jeśli po nim może być spacja, dodaj też spację: rtrim($s, ', ').
Jak przyciąć każdą wartość w tablicy?
array_map('trim', $array) zwraca nową tablicę z przyciętą każdą wartością, z zachowaniem kluczy. Dla tablic zagnieżdżonych użyj array_walk_recursive() z referencją.