Справочники, инструменты, документация

PHP: Удаление лишних пробелов

Обрабатывая информацию, собирая ее из разных источников, например с сайта поставщика, мы часто сталкиваемся с тем, что нам надо ее привести в достойный вид, удалив лишние пробелы.

Удаление пробелов в начале или конце строки

Стандартные функция trim( string $str [, string $character_mask = " \t\n\r\0\x0B" ]) удаляет все возможные пробелы в начале или в конце строки, так же эта функция может удалять те символы, которые вам не нужны, например точку или запятую:

$str = trim($str, ",");

или

$str = trim($str, ".");

Так же есть 2 функции, ltrim и rtrim, которые работают так же как и trim, за исключением того , что ltrim удаляет символы в начале строки, а rtrim в конце.

Удаление лишних пробелов в самом тексте

Иногда нужно удалить лишние пробелы, а иногда и табы, в самом тексте, например:

«Купив телефон сегодня вы  получите самый   лучший подарок».

В этом тексте после каждого слова стоит более 1 пробела, Попробуем заменить лишние через регулярное выражение:

$str = preg_replace('/\s+/', ' ', $str);

В данном случае \s говорит что надо заменить все пробелы, а + включая табы на 1 пробел. Если вы считаете, что регулярные выражения зло, то можно использовать:

$str = str_replace("    ", " ", $str);
while( strpos($str," ")!==false){
    $str = str_replace(" ", " ", $str);
}

Удаление «не удаляемых» пробелов

Возможно вы столкнулись с такой проблемой, что ни одно из средств перечисленных выше не удаляет пробелы. Для начала рассмотрите внимательно текст, желательно в исходном коде, потому что текст «Купив телефон сегодня вы получите самый лучший подарок» может оказаться таким:

«` `Купив ` `телефон` `сегодня вы` `получите самый лучший подарок».

Для начала надо заменить   и   просто на пробелы:

$str = str_replace('&', '&', $str);
$str = str_replace(' ', ' ', $str);

А потом, применить один из способов выше.

Хорошо, это мы сделали, но у нас остались лишние пробелы, которые не удаляются стандартными методами. Вероятнее всего это NO-BREAK SPACE, в таблице utf-8 символов он идет как c2a0.

Для начала попробуйте перевести ваш текст в HEX:

echo bin2hex($str);
echo substr_count($str, "\xc2\xa0");

и поищите там: c2a0.

Удаление через регулярное выражение:

echo preg_replace('!\s++!u', ' ', $str);

Удаление без регулярного выражения:

$text = hex2bin(str_replace('c2a0', '20', bin2hex($str)));
while( strpos($text,' ')!==false){
    $text = str_replace(" ", " ", $text);
}
$text = trim($text);

Переводим наш текс в HEX, заменяем NO-BREAK SPACE на обычный пробел, переводим обратно в обычный текст, после этого можно сделать замену пробелов и чистку.