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.