trim($string) возвращает строку без пробельных символов в начале и в конце: пробелов, табуляций, переносов строк, возвратов каретки, NUL-байтов и вертикальных табуляций. ltrim() удаляет их только в начале, а rtrim() только в конце. Пробелы в середине сохраняются.
Вывод var_dump() показывает длину каждого результата, и так удалённые символы становятся видны. Обрезка пробелов это первое, что нужно сделать с большинством значений из формы (исключение пароли, смотрите конец страницы): пользователь, который ввёл ada@example.com с пробелом в конце, всё равно должен суметь войти.
Синтаксис
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() возвращает новую строку и не меняет переданную переменную.
Удаление определённых символов
Второй аргумент заменяет стандартный список. Каждый символ из него удаляется с концов, в любом порядке и сколько угодно раз. .. задаёт диапазон, поэтому 'a..z' означает все строчные буквы.
Чтобы по-прежнему удалять и обычные пробельные символы, включите их в список: trim($s, " \n\r\t\v\0/").
Второй аргумент это набор символов, а не строка
trim() не удаляет слово или суффикс. Она удаляет любые из перечисленных символов с обоих концов, пока не встретит символ не из списка. Это удивляет тех, кто пытается убрать расширение файла:
Первая строка удаляет и h в начале, потому что h есть в наборе. Чтобы убрать фиксированный префикс или суффикс, используйте str_starts_with() или str_ends_with() вместе с substr() или str_replace(), если этот текст не может встретиться больше нигде.
Полноширинный пробел (японский ввод)
Японские клавиатуры часто вводят идеографический пробел (U+3000), например вокруг имени в форме. Его нет в стандартном списке trim, а указывать его во втором аргументе опасно: trim() работает побайтно, этот пробел это 3 байта E3 80 80, а E3 это ещё и первый байт каждого символа хираганы и катаканы, поэтому имя, которое начинается с такого символа, теряет его первый байт. Используйте регулярное выражение с модификатором u:
\A и \z привязывают к началу и концу строки. С модификатором u \s совпадает с любым пробелом Unicode: пробельными символами ASCII, полноширинным пробелом и неразрывным пробелом (U+00A0), который часто приносит копирование с веб-страниц. Без u \s совпадает только с пробельными символами ASCII, и полноширинный пробел остаётся. В PHP 8.4 для этого появились mb_trim(), mb_ltrim() и mb_rtrim(); в PHP 8.3 и раньше выход это регулярное выражение.
Обрезка каждого значения массива
array_map('trim', $array) обрезает каждое значение и сохраняет ключи. Типичный случай это список через запятую из текстового поля, разбитый через explode():
Обрезка значения формы перед проверкой
Сначала обрежьте, потом проверьте на пустую строку. Тогда поле, где одни пробелы, отклоняется как пустое. Запустите этот блок, введите в форму имя с пробелами вокруг и нажмите Send: тот же скрипт выполнится снова с заполненным $_POST.
Не обрезайте пароли: пробел в конце пароля это часть пароля.
Часто задаваемые вопросы
Что удаляет trim() в PHP?
По умолчанию с обоих концов строки: пробелы, табуляции (\t), переносы строк (\n), возвраты каретки (\r), NUL-байты (\0) и вертикальные табуляции (\v). Середину строки функция никогда не трогает.
Чем отличаются trim, ltrim и rtrim?
trim() чистит оба конца, ltrim() только начало, а rtrim() только конец. Все три принимают одинаковый необязательный список символов для удаления.
Почему trim() не удаляет японский полноширинный пробел?
Полноширинного пробела (U+3000) нет в стандартном списке trim, а в UTF-8 он занимает 3 байта. Используйте preg_replace('/\A\s+|\s+\z/u', '', $s): с модификатором u \s совпадает с любым пробелом Unicode, включая U+3000. В PHP 8.4 появилась mb_trim(), которая тоже его удаляет.
Как удалить последнюю запятую из строки в PHP?
rtrim($s, ',') удаляет все запятые в конце. Если после неё может стоять пробел, добавьте и его: rtrim($s, ', ').
Как обрезать пробелы у каждого значения массива?
array_map('trim', $array) возвращает новый массив, где каждое значение обрезано, а ключи сохранены. Для вложенных массивов используйте array_walk_recursive() со ссылкой.