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

Веб-программирование 25 сентября 2016 г., 7:53

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

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

Стандартные функция 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 на обычный пробел, переводим обратно в обычный текст, после этого можно сделать замену пробелов и чистку.

Возможно у вас есть свой способ, может более практичный, как исправлять "не удаляемые" пробелы, то поделитесь в комментариях.



Станьте первым!

Пожалуйста, авторизуйтесь или зарегистрируйтесь для комментирования!

Яндекс.Метрика