Удаление лишних пробелов в 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 символов он идет как c2 a0.
Для начала попробуйте перевести ваш текст в HEX:
echo bin2hex($str); echo substr_count($str, "\xc2\xa0");
и поищите там: c2a0, как видно на скриншоте, у меня аж 2 таких пробела
Удаление через регулярное выражение:
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 на обычный пробел, переводим обратно в обычный текст, после этого можно сделать замену пробелов и чистку.
Возможно у вас есть свой способ, может более практичный, как исправлять "не удаляемые" пробелы, то поделитесь в комментариях.
Станьте первым!