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?

joepour
fonte
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);
jW.
fonte
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.

Cory Dee
fonte
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.

d -_- b
fonte
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.

Lukas Liesis
fonte
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;
Apsar
fonte
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;
}
Fom
fonte
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
4
$str = preg_replace('/[\s]+/', ' ', $str);
Sandip Layek
fonte
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.

Amir Fo
fonte
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.

JScarry
fonte
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))).

Zsolt Oroszlány
fonte
-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);
Shahbaz Khan
fonte