Como remover quebras de linha (sem caracteres!) Da string?

146

Isso pode parecer uma bobagem, mas tenha certeza de que não. Pesquisei tanto no SO quanto no resto da web por uma resposta para o meu problema e acabei encontrando as mesmas "soluções" insuficientes repetidamente. De qualquer forma, aqui vai:

Estou salvando a entrada do usuário de uma área de texto em um banco de dados MySQL (em um ambiente WordPress, mas isso não deve importar para esse problema, acredito). Mais tarde, ele é recuperado do banco de dados para ser mostrado aos administradores no back-end do site. O problema ocorre quando os usuários enviam texto com quebras de linha (por exemplo, pressione a tecla Enter).

Uma sequência de amostra pode ser assim:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!

Greetings,
Bill

Não há caracteres de fim de linha ("\ n", "\ r" ou similares) na string.

Estou usando nl2br()para gerar saída HTML, mas isso não é suficiente. O resultado é então:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill

Qual, até onde eu entendi, é o nl2br()resultado esperado , pois ele insere as tags e não substitui as quebras de linha em primeiro lugar?

No entanto, o formato que eu preciso seria este:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br /><br />Greetings,<br />Bill

Se a string continha caracteres EOL como "\ n", eu a pressionaria com uma das str_replace()teclas preg_replace()e terminaria com ela, mas não tenho idéia de qual agulha alimentar essas funções, se não houver caracteres. em primeiro lugar.

Posso acessar manualmente o campo relevante no banco de dados, pressionar Backspace para cada quebra de linha e o que mais tarde quero fazer com a string funciona. Então eu sei que preciso do formato acima.

Johannes Pille
fonte
Se a string se parece com o seu primeiro exemplo, como você pode dizer que não possui caracteres de quebra de linha? Tem pelo menos dois: dois seguidos depois de "obrigado!"
Ernest Friedman-Hill
Fair enuff @ ErnestFriedman-Hill, você obviamente está certo - há "algo" lá, não é visível nem nada que eu saiba.
Johannes Pille 25/05
Também não consigo ver como é possível ter novas linhas sem caracteres de quebra de linha. Você pode usar um editor hexadecimal para inspecionar a string - Tenho certeza que você vai encontrar os personagens para novas linhas ...
urtiga

Respostas:

376

Você deve poder substituí-lo por um preg que remove todas as novas linhas e devoluções de carro. O código é:

preg_replace( "/\r|\n/", "", $yourString );

Mesmo que os \ncaracteres não estejam aparecendo, se você estiver obtendo retornos de carro, haverá um caractere invisível lá. O preg substituir deve pegar e consertá-los.

Ben Roux
fonte
Inacreditável. Eu poderia jurar ter tentado de tudo ao seu alcance e as respostas do @bsdnoobz, que fazem o trabalho. Oh, bem, seja qual for o bloqueio mental que eu tenha lá, vocês dois me pouparam toneladas de tempo. Acabou sendo uma pergunta bastante idiota, eu acho. Obrigado rapazes!
Johannes Pille
3
Observe que isso não corresponde a todas as quebras de linha, ou seja, aquelas criadas nos sistemas Windows. Para capturá-los, você pode usar o seguinte RegEx/\r|\n|\r\n/
Toastrackenigma
6
uso \ R (que representa qualquer linha de sequência final) stackoverflow.com/a/16274784/1491212
Armel Larcier
435

A solução de Ben é aceitável, mas str_replace () é muito mais rápida que preg_replace ()

$buffer = str_replace(array("\r", "\n"), '', $buffer);

Usando menos energia da CPU, reduz as emissões mundiais de dióxido de carbono.

Demis Palma ツ
fonte
5
Não posso acreditar que esta resposta não tenha mais credibilidade. 100 polegar para cima para este preg_replace sobre ()
pimbrouwers
62
IMPORTANTE: Use CITAÇÕES DUPLAS nos códigos de retorno de carro e de nova linha. Eles não serão processados ​​corretamente se você usar aspas simples!
bwright
47
Polegares para cima -> "Usando menos energia da CPU, reduz as emissões mundiais de dióxido de carbono".
Jan
3
@ Joeri: Esse último nunca será chamado, pois será tratado pelos dois primeiros. É um código redundante.
precisa saber é o seguinte
4
@ Joeri Considerando que str_replace remove todas as ocorrências, \ re e \ n ambos serão removidos de qualquer maneira?
Bram Vanroy
16
$str = "
Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill";

echo str_replace(array("\n", "\r"), '', $str);  // echo $str in a single line
Flui livremente
fonte
11

É porque nl2br()não remove novas linhas.

Retorna string com <br />ou <br> inseridos antes de todas newlines ( \r\n, \n\r, \ne \r).

Use em str_replacevez disso:

$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
kenorb
fonte
7

Você também pode usar o trim do PHP

Esta função retorna uma string com espaço em branco retirado do início e do final de str. Sem o segundo parâmetro, trim () removerá esses caracteres:

  • "" (ASCII 32 (0x20)), um espaço comum.
  • "\ t" (ASCII 9 (0x09)), uma guia.
  • "\ n" (ASCII 10 (0x0A)), uma nova linha (avanço de linha).
  • "\ r" (ASCII 13 (0x0D)), um retorno de carro.
  • "\ 0" (ASCII 0 (0x00)), o byte NUL.
  • "\ x0B" (ASCII 11 (0x0B)), uma guia vertical.
Gijs de Jong
fonte
3
Isso direcionará apenas as novas linhas no início e no final da string. As novas linhas no meio da string não serão tocadas.
Mckmackusa
6

Para funcionar corretamente também no Windows, sugiro usar

$buffer = str_replace(array("\r\n", "\r", "\n"), "", $buffer);

"\r\n"- para Windows, "\r"- para Mac e "\n"- para Linux

Ajjaah
fonte
2
Desculpe, cara, mas mesmo tendo perguntado em 12, posso dizer com absoluta certeza que isso é redundante. Pergunte a si mesmo o seguinte: Se todos \re \nforem removidos na sequência, por que não seria o caso daqueles que se seguem diretamente?
Johannes Pille
Realmente, essa coisa óbvia não me veio à mente ... Obrigado :) Acabei de perceber que tive problemas com isso, mas foi o contrário, usei \r\nno Windows e não funcionou no Linux.
Ajjaah
Bem, estou usando essa função para substituir quebras de linha por vírgulas, para que um endereço seja um texto de linha única, portanto, substituir o \r\nFIRST ajudaria, pois isso significa uma vírgula em vez de duas para cada parte, se essa linha for quebrada
Martin
@ Martin Sim, você está certo, eu acabei de perceber o mesmo, então substituímos \r\nprimeiro, depois substituímos \re \n, editei minha resposta.
Ajjaah
Isso ainda é redundante; se você remover todos os itens \re \r, não for necessário removê- \r\nlos, você poderá str_replace(array("\r","\n"), "", $buffer);obter o mesmo resultado.
stramin
6

str_replace (PHP_EOL, nulo, $ str);

Rafanake
fonte
1
enquanto isso pode responder à pergunta. É aconselhável explicar um pouco sobre sua resposta.
Anirudh Sharma
PHP_EOL nem sempre funciona quando você lê uma string. Faz quando você os escreve.
precisa saber é o seguinte
As respostas somente de código são de baixo valor no StackOverflow, porque fazem muito pouco para educar o OP e futuros leitores.
Mickmackusa
4

Algo um pouco mais funcional (fácil de usar em qualquer lugar):

function strip_carriage_returns($string)
{
    return str_replace(array("\n\r", "\n", "\r"), '', $string);
}

Usar o PHP_EOL como parâmetro de substituição de pesquisa também é uma boa ideia! Parabéns.

tfont
fonte
1

Alternativa incorporada: trim ()

trim  Strip whitespace (or other characters) from the beginning and end of a string
Description 
trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] ) : string

This function returns a string with whitespace stripped from the beginning and end of str.
Without the second parameter, trim() will strip these characters:

    " " (ASCII 32 (0x20)), an ordinary space.
    "\t" (ASCII 9 (0x09)), a tab.
    "\n" (ASCII 10 (0x0A)), a new line (line feed).
    "\r" (ASCII 13 (0x0D)), a carriage return.
    "\0" (ASCII 0 (0x00)), the NUL-byte.
    "\x0B" (ASCII 11 (0x0B)), a vertical tab.

Está lá para remover quebras de linha de diferentes tipos de arquivos de texto, mas não lida com html.

NVRM
fonte
0

Eu uso 3 linhas para fazer este trabalho, então considere $ s como seu "material" ...

$s=str_replace(chr(10),'',$s);
$s=str_replace(chr(13),'',$s);
$s=str_replace("\r\n"),'',$s);
PYK
fonte