Remova novas linhas da cadeia e substitua por um espaço vazio

291
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

Deseja remover todas as novas linhas da string.

Eu tenho esse regex, ele pode pegar todos eles, o problema é que eu não sei com qual função devo usá-lo.

/\r\n|\r|\n/

$string Deve se tornar:

$string = "put returns between paragraphs for linebreak add 2 spaces at end ";
James
fonte
1
Se você estiver fazendo milhares de substituições, evite usar preg_replace. É quase duas vezes mais lento que str_replace.
Alex W
Você pode achar s($str)->normalizeLineEndings('')útil, conforme encontrado nesta biblioteca autônoma . Ele removerá não apenas LF, CR e CRLF, mas também qualquer nova linha Unicode.
caw

Respostas:

578

Você deve ter cuidado com quebras de linha duplas, o que causaria espaços duplos. Use esta expressão regular realmente eficiente:

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

Vários espaços e novas linhas são substituídos por um único espaço.

Editar: como outros já apontaram, esta solução apresenta problemas que correspondem a novas linhas únicas entre as palavras. Isso não está presente no exemplo, mas é possível ver facilmente como essa situação pode ocorrer. Uma alternativa é fazer o seguinte:

$string = trim(preg_replace('/\s+/', ' ', $string));
jwueller
fonte
10
Antes de usar esta solução, veja minha resposta abaixo e os comentários à minha resposta. Esta solução pode não funcionar como o esperado.
matsolof 23/09/10
1
na expressão regular "\ s Corresponder a um caractere de espaço em branco", por que corresponderia a uma nova linha?
Michael Z
2
Eu estava procurando uma solução para remover / substituir todos os espaços em branco, mas não os espaços (duplos). Este é o regex que fez isso:/(?![ ])\s+/
algoritmo
Só queria que você soubesse que sua solução me salvou muito tempo.
Parthapratim Neog
183

Alguns comentários sobre a resposta aceita:

Os +meios "1 ou mais". Eu não acho que você precise repetir \s. Eu acho que você pode simplesmente escrever '/\s+/'.

Além disso, se você deseja remover os espaços em branco primeiro e último na cadeia, adicione trim.

Com essas modificações, o código seria:

$string = preg_replace('/\s+/', ' ', trim($string));
Matsolof
fonte
Você está certo; /\s\s+/falharia em corresponder ao avanço de linha foo\nbar.
Alan Moore
79

Apenas use preg_replace()

$string = preg_replace('~[\r\n]+~', '', $string);

Você pode se safar str_replace()dessa, embora o código não pareça tão limpo:

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

Veja ao vivo em ideone

NullUserException
fonte
1
O OP deseja um espaço entre "parágrafos" e "para". Se você apenas remover os caracteres da nova linha, não haverá um.
Daniel Vandersluis
corrija isso para$string = preg_replace("~[\r\n]~", "",$string);
erikbwork
Caso contrário, não há mais nada a dizer. essa é a resposta mais simples, eu acho!
precisa saber é o seguinte
3
@erik Então eu estaria "incorretando" isso. Funciona bem como está.
NullUserException 21/09
1
@Vineet É apenas um delimitador denotando início e no final da regex
NullUserException
21
$string = str_replace(array("\n", "\r"), ' ', $string);
fabrik
fonte
3
As seqüências de escape no PHP precisam ser citadas duas vezes.
Daniel Vandersluis
Isso não faz exatamente o que o OP quer, porém, uma vez que este é o mesmo que a resposta de esquiva e não está removendo os \rpersonagens
NullUserException
@NullUser: Por que você não atualiza sua própria postagem em vez de comentar sobre isso?
fabrik
@NullUser: Exceto o fato de que substitui tudo por '' em vez de ''.
fabrik
12

Você deve usar str_replace por sua velocidade e usar aspas duplas com uma matriz

str_replace(array("\r\n","\r"),"",$string);
RobertPitt
fonte
Baixo em recursos, perfeito, tks.
CONV19191
1
Posso estar errado, mas esse código não remove o novo caractere de linha nos sistemas Unix, porque nesses sistemas a nova linha é justa \ne, \r\nalém disso, acho que o OP está pedindo para colocar um único espaço no lugar de novas linhas
Marco Demaio
7

Não tenho certeza se isso tem algum valor em relação às respostas já enviadas, mas posso postá-lo.

// Create an array with the values you want to replace
$searches = array("\r", "\n", "\r\n");

// Replace the line breaks with a space
$string = str_replace($searches, " ", $string);

// Replace multiple spaces with one
$output = preg_replace('!\s+!', ' ', $string);
Peter
fonte
6

As substituições de regex PCRE podem ser feitas usando preg_replace: http://php.net/manual/en/function.preg-replace.php

$new_string = preg_replace("/\r\n|\r|\n/", ' ', $old_string);

Substituiria nova linha ou retornaria caracteres por um espaço. Se você não deseja que nada os substitua, altere o segundo argumento para ''.

n00dle
fonte
1
As pregfunções usam expressões regulares PCRE, não POSIX. Existem eregfunções que usam POSIX, mas agora estão obsoletas.
Daniel Vandersluis
5

Usa isto:

substitua séries de novas linhas por uma sequência vazia:

$string = preg_replace("/[\\n\\r]+/", "", $string);

ou você provavelmente deseja substituir novas linhas por um único espaço:

$string = preg_replace("/[\\n\\r]+/", " ", $string);
netom
fonte
Formate seu código corretamente. Isso é feito recuando a linha relevante por quatro espaços.
precisa saber é o seguinte
2
É por isso que uso aspas simples para não precisar escapar desses caracteres. \\nparece terrível. \\\\ combinar uma única barra invertida é simplesmente horrível.
NullUserException 21/09
5

A sequência de escape\R corresponde a uma nova linha genérica

isto é, qualquer coisa considerada uma sequência de quebra de linha por Unicode. Isso inclui todos os caracteres correspondidos por \v( espaço em branco vertical ) e a sequência de vários caracteres \x0D\x0A...

$string = preg_replace('/\R+/', " ", $string);

No modo não UTF-8 de 8 bits, \Ré equivalente ao seguinte: (?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

Regex101 Demo

Anton
fonte
Anton, por favor verifique, se minha edição está ok! Adicionadas mais informações.
Bubble Bobble
4

As quebras de linha no texto são geralmente representadas como:

\ r \ n - em um computador com Windows

\ r - em um computador Apple

\ n - no Linux

//Removes all 3 types of line breaks

$string = str_replace("\r", "", $string);

$string = str_replace("\n", "", $string);
Md. Al Amin Bhuiyan
fonte
3

Sobre o quê:

$string = trim( str_replace( PHP_EOL, ' ', $string ) );

Esta deve ser uma solução bastante robusta, porque \ n não funciona corretamente em todos os sistemas se não estiver errado ...

GDY
fonte
Isto não parece substituir \ r, mas apenas \ n: ideone.com/28KPcb
T30
Conforme mencionado no manual, o PHP_EOL contém o símbolo 'End Of Line' correto para a plataforma atual. Se você importar cadeias de outras plataformas ou tiver apenas cadeias formatadas incorretas, isso poderá ser interrompido.
GDY
Se você tem um ambiente bastante fechado, essa parece ser a solução mais elegante para mim, porque é independente da plataforma e provavelmente tem um bom desempenho ... se você tem uma entrada mais ampla, como cenários de importação / exportação, provavelmente deve usar uma solução regex.
GDY
3

Fiquei surpreso ao ver quão pouco todo mundo sabe sobre regex.

As novas linhas de tira em php são

$str = preg_replace('/\r?\n$/', ' ', $str);

Em perl

$str =~ s/\r?\n$/ /g;

O significado substitui qualquer caractere de nova linha no final da linha (por eficiência) - opcionalmente precedido por um retorno de carro - por um espaço.

\ n ou \ 015 é nova linha. \ r ou \ 012 é retorno de carro. ? em regex significa corresponder 1 ou zero do caractere anterior. $ em regex significa que corresponde ao final da linha.

A referência original e melhor do regex é perldoc perlre, todo codificador deve conhecer este documento muito bem: http://perldoc.perl.org/perlre.html Observe que nem todos os recursos são suportados por todos os idiomas.

ekerner
fonte
Esta solução não funcionou para mim, mas, como mencionado, precisarei ler mais para produzir a solução real. Fiquei surpreso que isso não funcionou.
9119 Adam Smith #
2

este é o padrão que eu usaria

$string = preg_replace('@[\s]{2,}@',' ',$string);
Rajeev
fonte
2

talvez isso funcione:

$str='\n';
echo str_replace('\n','',$str);
زي
fonte
1

Este também remove guias

$string = preg_replace('~[\r\n\t]+~', '', $text);
user3213174
fonte
1

Você pode tentar abaixo o código preservará qualquer espaço em branco e novas linhas no seu texto.

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

echo preg_replace( "/\r|\n/", "", $str );
PCMShaper
fonte
1

Muitas dessas soluções não funcionaram para mim. Isso fez o truque: -

$svgxml = preg_replace("/(*BSR_ANYCRLF)\R/",'',$svgxml);

Aqui está a referência: - PCRE e Novas Linhas

Adam Whateverson
fonte
0

este código abaixo funciona todo o texto, use-o:

$des = str_replace('\n',' ',$des);
$des = str_replace('\r',' ',$des);

fonte
0

Você pode remover nova linha e vários espaços em branco.

$pattern = '~[\r\n\s?]+~';
$name="test1 /
                     test1";
$name = preg_replace( $pattern, "$1 $2",$name);

echo $name;
Ramesh
fonte