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


132

Я получаю строку из запроса к базе данных, затем удаляю все HTML-теги, символы возврата каретки и символы новой строки, прежде чем помещать ее в файл CSV. Единственное, я не могу найти способ удалить лишнее пустое пространство между строками.

Как лучше всего удалить внутренние символы пробела?


6
Пожалуйста, отправьте образец исходной строки и желаемой строки.
Zote

Не могли бы вы также прояснить, каким должен быть окончательный результат? Вы вставляете запятые в данные для CSV, получаете их из базы данных с уже имеющимися запятыми, вводите строки в функцию, которая обрабатывает вставку CSV и т. Д.?
Фрэнк ДеРоса,

ОК, окончательный вывод должен быть строкой, в которой каждое слово разделено одним пробелом, на данный момент это несколько пробелов.
joepour

1
@ Джо, я бы не стал терять время и хотел бы отдать должное всем, кто помогал тебе раньше! :)
Фрэнки

Ответы:


286

Не уверен, что именно вы хотите, но есть две ситуации:

  1. Если вы просто имеем дело с избытком whitespaceна начало или конец строки , вы можете использовать trim(), ltrim()или rtrim()удалить его.

  2. Если вы имеете дело с лишними пробелами в строке, рассмотрите preg_replaceнесколько вариантов whitespaces " "*с одним whitespace " ".

Пример:

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

62
$ foo = preg_replace ('/ \ s + /', '', $ foo);
genio

использование $foo = preg_replace( '/\s+/', ' ', $foo );воли убивает эффектыnl2br()
Вайыл Карим

1
просто используйте nl2br перед использованием preg_replace, и все будет хорошо.
Lukas Liesis

Замечание об опечатке / Escaper - если код не удаляет лишние пробелы - убедитесь, что у вас есть "\" перед "s" :) некоторые страницы онлайн-тестирования php удаляют его :)
jave.web

Это должно быть безопасно для CSS, верно? Например, это безопасно сжать переменную, содержащую длинную многострочную строку CSS?
Дэвид

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

Или замените на подчеркивание, & nbsp; и т. д.


7
Это удаляет все пробелы. Он просто хочет нормализовать строку.
Svend

12
То, что я искал (хотя вопрос не в этом)
Sevenearths

@Gigala "Как лучше всего удалить внутренние символы пробела?" был вопрос. Этот ответ полностью удовлетворяет это.
Кори Ди,

1
@CoryDee Это правда, для последнего предложения. Но во введении вопрос сформулирован как « лишние пробелы» с акцентом на лишнее. В конце концов, вы удовлетворили ФАКТИЧЕСКУЮ проблему ОП, так что это не имеет большого значения, но пока мы разбираемся в технических вопросах ...
Спенсер Раскин

Это не работает , если счетчик из пространств является четным числом , скажем: Hi Earthс 4 - пространства между ними будет: HiEarth. Это не решает мою проблему, связанную с вопросом.
JJ Labajo

26

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

Приведенная выше строка кода удалит лишние пробелы, а также начальные и конечные пробелы.


25

Ни один из других примеров у меня не работал, поэтому я использовал этот:

trim(preg_replace('/[\t\n\r\s]+/', ' ', $text_to_clean_up))

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


Спасибо, @ wp78de, но по какой-то причине у меня возникли проблемы с просто \s+. Хотя это было еще в 2014 году, поэтому, возможно, он был изменен, не касался PHP в течение последних 3 лет, не может комментировать, но оставит текущий ответ, пока это было решение, и может все еще быть в некоторых случаях.
Лукас Лисис

9

Если вы хотите заменить только несколько пробелов в строке, например: "this string have lots of space . " И вы ожидаете, что ответ будет "this string have lots of space", вы можете использовать следующее решение:

$strng = "this string                        have lots of                        space  .   ";

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

echo $strng;

5

Использование preg_replace () имеет недостатки безопасности, если вы получаете полезную нагрузку из пользовательского ввода [или из других ненадежных источников]. PHP выполняет регулярное выражение с помощью eval (). Если входящая строка не обработана должным образом, ваше приложение рискует подвергнуться инъекции кода .

В моем собственном приложении, вместо того, чтобы беспокоиться о дезинфекции ввода (и поскольку я имею дело только с короткими строками), я вместо этого сделал немного более интенсивную функцию процессора, хотя и безопасную, поскольку она ничего не использует eval ().

function secureRip(string $str): string { /* Rips all whitespace securely. */
  $arr = str_split($str, 1);
  $retStr = '';
  foreach ($arr as $char) {
    $retStr .= trim($char);
  }
  return $retStr;
}

Он выполняет его с использованием eval только в том случае, если вы укажете модификатор 'e': php.net/manual/en/… в нем также указано, что «Эта функция УСТАРЕЛА в PHP 5.5.0 и УДАЛЕНА в PHP 7.0.0. " Таким образом, вы больше не можете выполнять оценку в preg_replace.
ADJenks


2

Ты можешь использовать:

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

Это удаляет лишние пробелы с обеих сторон строки и преобразует два пробела в один внутри строки. Обратите внимание, что это не преобразует три или более пробелов подряд в один! Еще один способ, который я могу предложить, - это использовать взрыв и взрыв, который безопаснее, но совершенно не оптимален!

$str = implode(" ", array_filter(explode(" ", $str)));

Я предлагаю использовать собственный цикл for или регулярное выражение для выполнения такой работы.


Это не приведет к правильному преобразованию нескольких пробелов, если длина пробела превышает два.
mikeybeck

1

Чтобы расширить ответ Сандипа, у меня в журналах появилось несколько строк, которые были неправильно закодированы в bit.ly. Они хотели закодировать только URL-адрес, но после пробела поместили дескриптор твиттера и еще кое-что. Это выглядело так

? productID =26%20via%20@LFS

Обычно это не проблема, но я получаю много попыток SQL-инъекций, поэтому я перенаправляю все, что не является допустимым идентификатором, на 404. Я использовал метод preg_replace, чтобы преобразовать недопустимую строку productID в строку действительный productID.

$productID=preg_replace('/[\s]+.*/','',$productID);

Я ищу пробел в URL-адресе, а затем удаляю все после него.


0

Недавно я написал простую функцию, которая удаляет лишние пробелы из строки без регулярного выражения implode(' ', array_filter(explode(' ', $str))).


-1
$str = "I      am a PHP   Developer";
$str_length = strlen($str);
$str_arr = str_split($str);
for ($i = 0; $i < $str_length; $i++) {
   if (isset($str_arr[$i + 1])  && $str_arr[$i] == ' ' && $str_arr[$i] == $str_arr[$i + 1]) {
       unset($str_arr[$i]);
   } 
   else {
     continue;
   }
}
echo implode("", $str_arr);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.