Menu

PHP trim(): удалить пробелы в начале и конце строки

trim($string) удаляет пробелы, табуляции и переносы строк с обоих концов строки; ltrim() и rtrim() чистят одну сторону. Как удалять определённые символы, японский полноширинный пробел и обрезать каждое значение массива.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

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() со ссылкой.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ