trim($string) retorna a string sem os espaços em branco do início e do fim: espaços, tabulações, quebras de linha, retornos de carro, bytes NUL e tabulações verticais. O ltrim() os remove só do início e o rtrim() só do fim. Os espaços do meio são mantidos.
A saída do var_dump() mostra o tamanho de cada resultado, o que deixa visíveis os caracteres removidos. Aplicar trim é a primeira coisa a fazer com a maioria dos valores de um formulário (senhas são a exceção, veja o fim da página): um usuário que digita ada@example.com com um espaço no fim ainda deve conseguir entrar.
Sintaxe
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
O trim() retorna uma nova string; ele não altera a variável que você passa.
Remover caracteres específicos
O segundo argumento substitui a lista padrão. Cada caractere dela é removido das pontas, em qualquer ordem e quantas vezes for. .. define um intervalo, então 'a..z' significa todas as letras minúsculas.
Para continuar removendo também os espaços normais, inclua-os na lista: trim($s, " \n\r\t\v\0/").
O segundo argumento é um conjunto de caracteres, não uma string
O trim() não remove uma palavra ou um sufixo. Ele remove qualquer um dos caracteres listados, das duas pontas, até encontrar um que não está na lista. Isso surpreende quem tenta tirar a extensão de um arquivo:
A primeira linha também remove o h do início, porque h está no conjunto. Para remover um prefixo ou sufixo fixo, use str_starts_with() ou str_ends_with() com substr(), ou str_replace() se o texto não puder aparecer em outro lugar.
Remover o espaço de largura total (entrada em japonês)
Teclados japoneses muitas vezes produzem o espaço ideográfico (U+3000), por exemplo em volta de um nome digitado num formulário. Ele não está na lista padrão do trim, e colocá-lo no segundo argumento é uma armadilha: o trim() trabalha byte a byte, o espaço são os 3 bytes E3 80 80, e E3 também é o primeiro byte de todo caractere hiragana e katakana, então um nome que começa com um deles perde o primeiro byte desse caractere. Use uma expressão regular com o modificador u:
\A e \z ancoram no início e no fim da string. Com o modificador u, \s bate com todo espaço Unicode: os espaços ASCII, o espaço de largura total e o espaço não separável (U+00A0) que copiar e colar de páginas web costuma trazer. Sem u, \s só bate com espaços ASCII e o espaço de largura total fica. O PHP 8.4 adiciona mb_trim(), mb_ltrim() e mb_rtrim() para isso; no PHP 8.3 e anteriores, a regex é o caminho.
Aplicar trim em cada valor de um array
array_map('trim', $array) aplica trim em cada valor e mantém as chaves. Um caso típico é uma lista separada por vírgulas vinda de um campo de texto, dividida com explode():
Aplicar trim num valor de formulário antes de validar
Primeiro o trim, depois a verificação de string vazia. Um campo que contém só espaços é então rejeitado como vazio. Rode este bloco, digite um nome com espaços em volta no formulário e clique em Send: o mesmo script roda de novo com $_POST preenchido.
Não aplique trim em senhas: um espaço no fim de uma senha faz parte dela.
Perguntas frequentes
O que o trim() remove no PHP?
Por padrão, das duas pontas da string: espaços, tabulações (\t), quebras de linha (\n), retornos de carro (\r), bytes NUL (\0) e tabulações verticais (\v). Ele nunca mexe no meio da string.
Qual a diferença entre trim, ltrim e rtrim?
O trim() limpa as duas pontas, o ltrim() só o início e o rtrim() só o fim. Os três recebem a mesma lista opcional de caracteres a remover.
Por que o trim() não remove o espaço japonês de largura total?
O espaço de largura total (U+3000) não está na lista padrão do trim e ocupa 3 bytes em UTF-8. Use preg_replace('/\A\s+|\s+\z/u', '', $s): com o modificador u, \s bate com todo espaço Unicode, U+3000 incluído. O PHP 8.4 adiciona o mb_trim(), que também o remove.
Como removo a última vírgula de uma string no PHP?
rtrim($s, ',') remove todas as vírgulas finais. Se um espaço puder vir depois dela, inclua o espaço também: rtrim($s, ', ').
Como aplico trim em cada valor de um array?
array_map('trim', $array) retorna um novo array com cada valor sem espaços nas pontas, mantendo as chaves. Para arrays aninhados, use array_walk_recursive() com uma referência.