Remova o excesso de espaço em branco de dentro de uma string


132

Recebo uma string de uma consulta ao banco de dados e removo todas as tags HTML, retornos de carro e novas linhas antes de colocá-la em um arquivo CSV. A única coisa é que não consigo encontrar uma maneira de remover o excesso de espaço em branco entre as strings.

Qual seria a melhor maneira de remover os caracteres de espaço em branco interno?


6
Poste uma amostra da string original e da desejada.
Zote 9/11/2009

Você também pode esclarecer como deve ser o resultado final? Você está inserindo as vírgulas nos dados para CSV, obtendo-os de um banco de dados com vírgulas, alimentando cadeias de caracteres em uma função que lida com a inserção de CSV, etc.?
Frank DeRosa

ok, o resultado final precisa ser uma string com cada palavra separada por um único espaço em branco; no momento, existem vários espaços em branco.
joepour

1
@ Joe, eu não perderia tempo e começaria a dar crédito a todos aqueles que o ajudaram antes! :)
Frankie

Respostas:


286

Não sabe exatamente o que deseja, mas aqui estão duas situações:

  1. Se você está lidando apenas com o excesso whitespaceno início ou no final da corda que você pode usar trim(), ltrim()ou rtrim()para removê-lo.

  2. Se você estiver lidando com espaços extras em uma string, considere um preg_replacemúltiplo whitespaces " "*com um único whitespace " ".

Exemplo:

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

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

usando a $foo = preg_replace( '/\s+/', ' ', $foo );vontade de matar os efeitos denl2br()
Waiyl Karim

1
basta usar o nl2br antes de usar o preg_replace e você deve estar pronto.
Lukas Liesis

Typo / Escaper nota - se o código não remove espaços em branco extra para você - certifique-se que você tem "\" antes de "s" :) algumas páginas on-line-teste-php removê-lo :)
jave.web

Isso deve ser seguro para CSS, certo? Como assim, isso comprimiria com segurança uma variável que continha uma string CSS longa e com várias linhas?
David

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

Ou substitua por sublinhado, & nbsp; etc etc.


7
Isso remove todo o espaço em branco. Ele só quer normalizar a corda.
Svend

12
O que eu estava procurando (mesmo que ele não era a pergunta)
Sevenearths

@Gigala "Qual seria a melhor maneira de remover os caracteres de espaço em branco interno?" foi a questão. Esta resposta satisfaz isso perfeitamente.
Cory Dee

1
@CoryDee Isso é verdade, para a última frase. Mas, na introdução, a questão é formulada como " excesso de espaço em branco", com ênfase no excesso. Você acabou satisfazendo problema real do OP, por isso não importa muito, mas enquanto estamos recebendo técnico sobre isso ...
Spencer Ruskin

Isso não funciona se a contagem de espaços é número par , vamos dizer: Hi Earthcom 4 espaços entre eles será: HiEarth. Isso não resolve meu problema com relevância para a pergunta.
JJ Labajo

26

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

A linha de código acima removerá espaços extras , além de espaços iniciais e finais.


25

nenhum dos outros exemplos funcionou para mim, então usei este:

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

isso substitui todas as guias, novas linhas, espaços duplos etc. para um espaço simples.


Obrigado, @ wp78de mas por qualquer motivo, tive problemas com apenas \s+. Embora tenha sido em 2014, talvez tenha sido alterado, não tocou no PHP nos últimos três anos, não pode comentar, mas deixará a resposta atual enquanto era uma solução e ainda pode estar em alguns casos.
Lukas Liesis

9

Se você deseja substituir apenas vários espaços em uma sequência, por exemplo: "this string have lots of space . " E você espera que a resposta seja "this string have lots of space", você pode usar a seguinte solução:

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

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

echo $strng;

5

Existem falhas de segurança no uso de preg_replace (), se você receber a carga útil da entrada do usuário [ou de outras fontes não confiáveis]. PHP executa a expressão regular com eval (). Se a sequência de caracteres recebida não for adequadamente higienizada, seu aplicativo corre o risco de ser submetido à injeção de código .

Em meu próprio aplicativo, em vez de me preocupar em higienizar a entrada (e como eu lida apenas com seqüências curtas), criei uma função um pouco mais intensiva do processador, embora seja segura, pois não avalia nada ().

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

Ele apenas o executa usando eval se você especificar o modificador 'e': php.net/manual/en/… e também diz que "Este recurso foi DEPRECADO no PHP 5.5.0 e REMOVIDO a partir do PHP 7.0.0. " Então você não pode mais avaliar coisas no preg_replace.
ADJenks


2

Você pode usar:

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

Isso remove espaços em branco extras de ambos os lados da string e converte dois espaços em um dentro da string. Observe que isso não converterá três ou mais espaços seguidos em um! Outra maneira que eu posso sugerir é usar implodir e explodir que é mais seguro, mas não totalmente ideal!

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

Minha sugestão é usar um loop for nativo ou regex para fazer esse tipo de trabalho.


Isso não converte vários espaços corretamente, onde o espaço é maior que dois espaços.
Mikeybeck 30/09/19

1

Para expandir a resposta de Sandip, eu tinha um monte de strings aparecendo nos logs que foram codificados incorretamente no bit.ly. Eles pretendiam codificar apenas o URL, mas colocar um identificador do twitter e outras coisas depois de um espaço. Parecia assim

? productID =26%20via%20@LFS

Normalmente, isso não seria um problema, mas estou recebendo muitas tentativas de injeção de SQL, então redireciono qualquer coisa que não seja um ID válido para um 404. Usei o método preg_replace para transformar a sequência productID inválida em um productID válido.

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

Eu procuro um espaço no URL e, em seguida, removo tudo depois dele.


0

Eu escrevi recentemente uma função simples que remove o excesso de espaço em branco da string sem expressão regular 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);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.