Remova vários espaços em branco

208

Estou recebendo $row['message']de um banco de dados MySQL e preciso remover todos os espaços em branco, como \n \tassim por diante.

$row['message'] = "This is   a Text \n and so on \t     Text text.";

deve ser formatado para:

$row['message'] = 'This is a Text and so on Text text.';

Eu tentei:

 $ro = preg_replace('/\s\s+/', ' ',$row['message']);
 echo $ro;

mas não remove \nou \tapenas espaços únicos. Alguém pode me dizer como fazer isso?

creativz
fonte
1
Os caracteres de nova linha e tab estão entre aspas simples, então você os deseja literal?
Mark Lalor
Corrigi a citação do código sectin com \ n e \ t, alterando-o para aspas duplas.
Buttle Butkus

Respostas:

394

Você precisa:

$ro = preg_replace('/\s+/', ' ',$row['message']);

Você está usando o \s\s+que significa espaço em branco (espaço, tabulação ou nova linha) seguido por um ou mais espaços em branco. O que significa efetivamente substituir dois ou mais espaços em branco por um único espaço.

O que você deseja é substituir um ou mais espaços em branco por um único espaço em branco, para que você possa usar o padrão \s\s*ou \s+(recomendado)

codaddict
fonte
1
O método dele é melhor do que isso: por que você substituiria um espaço por um espaço?
nickf
16
Ele também quer que \ ne seja substituído por espaço. Agora, seu padrão não corresponde a eles, digamos $ x = "does \ nth \ twork"; O OP deseja que todo o espaço em branco seja substituído por um único espaço.
Codaddict
@ cododdict, como podemos manter \ n e remover todos os outros espaços e guias múltiplos da string? por favor me ajude
Mansoorkhan Cherupuzha
Você pode ser mais específico por que "\ s +" é recomendado?
Isius 25/10
6
Note que no PHP \snão inclui "aba vertical" chr(11). Para incluí-lo, você também precisa usar spaceclasse de caracteres: [[:space:]]+ php.net/manual/en/regexp.reference.character-classes.php
Yaroslav
68
<?php
$str = "This is  a string       with
spaces, tabs and newlines present";

$stripped = preg_replace(array('/\s{2,}/', '/[\t\n]/'), ' ', $str);

echo $str;
echo "\n---\n";
echo "$stripped";
?>

Isso gera

This is  a string   with
spaces, tabs and newlines present
---
This is a string with spaces, tabs and newlines present
Cez
fonte
3
Você é um verdadeiro salva-vidas. Eu estava prestes a pular para fora da janela.
precisa saber é o seguinte
Neat, ainda útil
Spekulatius
16
preg_replace('/[\s]+/mu', ' ', $var);

\s já contém guias e novas linhas, portanto, este regex acima parece ser suficiente.

Anônimo
fonte
2
Os colchetes não são necessários aqui porque há apenas uma coisa dentro deles. O /mnão vai ter um efeito já que não existem ^ou $âncoras e /unão terá qualquer efeito, exceto para retardá-lo um pouco e morrer se a cadeia de entrada não é válido UTF-8 (que não afeta o que \scorresponde, mas isso afetaria \pZ)
thomasrutter
12

simplificado para uma função:

function removeWhiteSpace($text)
{
    $text = preg_replace('/[\t\n\r\0\x0B]/', '', $text);
    $text = preg_replace('/([\s])\1+/', ' ', $text);
    $text = trim($text);
    return $text;
}

com base na resposta de Danuel O'Neal.

Lukas Liesis
fonte
7
$str='This is   a Text \n and so on Text text.';
print preg_replace("/[[:blank:]]+/"," ",$str);
ghostdog74
fonte
2
Este é o que funcionou melhor para mim. Além disso, gostaria de acrescentar guarnição para o espaço em branco do apagamento no início e no final de corda
Dziamid
@Dziamid Você pode fazê-lo com guarnição (preg_replace (...))
Balázs Varga
7

Não consigo replicar o problema aqui:

$x = "this    \n \t\t \n    works.";
var_dump(preg_replace('/\s\s+/', ' ', $x));
// string(11) "this works."

Não tenho certeza se foi apenas um erro de transcrição ou não, mas no seu exemplo, você está usando uma string de aspas simples. \ne \tsão tratados apenas como nova linha e guia se você tiver uma sequência de aspas duplas. Isso é:

'\n\t' != "\n\t"

Edit : como Codaddict apontou, \s\s+não substituirá um único caractere de tabulação. Ainda não acho que o uso \s+seja uma solução eficiente, então, que tal isso:

preg_replace('/(?:\s\s+|\n|\t)/', ' ', $x);
nickf
fonte
2
+1, Verdadeiro. Para uma sequência com muitos espaços únicos (que geralmente é o caso), é ineficiente substituir um espaço por espaço.
Codaddict
1
@coaddict: para testar sua hipótese, escrevi um script rápido para executar 1000 de cada substituição e verificar o tempo de cada uma. Para a sequência '+1, True. Para uma sequência com muitos espaços únicos (que geralmente é o caso), é ineficiente substituir um espaço por espaço. - codaddict 24 de fevereiro \ '10 às 13:32 ' , mil \ s + preg_replace () levaram 0,010547876358032 segundos e mil (?: \ S \ s + | \ n | \ t) preg_replace () levaram 0,013049125671387, fazendo quase 30% mais lento.
Joseph Cheek
Você pode querer adicionar "\ r" para o último exemplo, como alguns computadores que usam um único "\ r" por conta própria (Apple Mac?)
thomasrutter
4
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

Isso substitui todas as guias, todas as novas linhas e todas as combinações de vários espaços, guias e novas linhas por um único espaço.

middus
fonte
4
<?php
#This should help some newbies
# REGEX NOTES FROM DANUEL
# I wrote these functions for my own php framework
# Feel Free to make it better
# If it gets more complicated than this. You need to do more software engineering/logic.
# (.)  // capture any character
# \1   // if it is followed by itself
# +    // one or more

class whitespace{

    static function remove_doublewhitespace($s = null){
           return  $ret = preg_replace('/([\s])\1+/', ' ', $s);
    }

    static function remove_whitespace($s = null){
           return $ret = preg_replace('/[\s]+/', '', $s );
    }

    static function remove_whitespace_feed( $s = null){
           return $ret = preg_replace('/[\t\n\r\0\x0B]/', '', $s);
    }

    static function smart_clean($s = null){
           return $ret = trim( self::remove_doublewhitespace( self::remove_whitespace_feed($s) ) );
    }
}
$string = " Hey   yo, what's \t\n\tthe sc\r\nen\n\tario! \n";
echo whitespace::smart_clean($string);
Danuel O'Neal
fonte
função estática remove_whitespace é por que motivo? Você define, mas nunca o usa.
Lukas Liesis
Cada um deles tem seu uso, mas nenhum deles alcançaria o que a pergunta pede: substituir vários espaços em branco consecutivos por apenas um. Seu "remove_doublewhitespace" substituiria apenas vários do mesmo caractere de espaço em branco; portanto, substituiria "\ n \ n \ n" por um '', mas não faria nada para "\ r \ n"
thomasrutter
4

Sem preg_replace ()

$str = "This is   a Text \n and so on \t     Text text.";
$str = str_replace(["\r", "\n", "\t"], " ", $str);
while (strpos($str, "  ") !== false)
{
    $str = str_replace("  ", " ", $str);
}
echo $str;
hharek
fonte
2

Eu uso este código e padrão:

preg_replace('/\\s+/', ' ',$data)

$data = 'This is   a Text 
   and so on         Text text on multiple lines and with        whitespaces';
$data= preg_replace('/\\s+/', ' ',$data);
echo $data;

Você pode testar isso em http://writecodeonline.com/php/

Catalin T.
fonte
Ele trabalha comigo mesmo em MariaDB nesta consulta: SELECT search_able, REGEXP_REPLACE (search_able,"\\s+",' ') FROM book where id =260 então muito obrigado
jalmatari
1

Tudo o que você precisa é executá-lo da seguinte maneira:

echo preg_replace('/\s{2,}/', ' ', "This is   a Text \n and so on \t     Text text."); // This is a Text and so on Text text.
Alex Polo
fonte
1

Isto é o que eu usaria:

uma. Certifique-se de usar aspas duplas, por exemplo:

$row['message'] = "This is   a Text \n and so on \t     Text text.";

b. Para remover espaço em branco extra, use:

$ro = preg_replace('/\s+/', ' ', $row['message']); 
echo $ro;

Pode não ser a solução mais rápida, mas acho que exigirá o mínimo de código e deve funcionar. Porém, nunca usei o mysql, por isso posso estar errado.

Matsolof
fonte
1

Na verdade, se você pensa que deseja algo assim:

preg_replace('/\n+|\t+|\s+/',' ',$string);
BigBlast
fonte
1

isso substituirá várias guias por uma única guia

preg_replace("/\s{2,}/", "\t", $string);
Heman G
fonte
-2

Sem preg_replace, com a ajuda do loop.

<?php

$str = "This is   a Text \n and so on \t     Text text.";
$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