Supprimer les nouvelles lignes de la chaîne et les remplacer par un espace vide

291
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

Vous souhaitez supprimer toutes les nouvelles lignes de la chaîne.

J'ai ce regex, il peut tous les attraper, le problème est que je ne sais pas avec quelle fonction dois-je l'utiliser.

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

$string devrait devenir:

$string = "put returns between paragraphs for linebreak add 2 spaces at end ";
James
la source
1
Si vous faites des milliers de remplacements, évitez d'utiliser preg_replace. C'est presque deux fois plus lent que str_replace.
Alex W
Vous trouverez peut-être s($str)->normalizeLineEndings('')utile, comme dans cette bibliothèque autonome . Il supprimera non seulement LF, CR et CRLF, mais également toute nouvelle ligne Unicode.
caw

Réponses:

578

Vous devez être prudent avec les doubles sauts de ligne, ce qui provoquerait des doubles espaces. Utilisez cette expression régulière vraiment efficace:

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

Plusieurs espaces et sauts de ligne sont remplacés par un seul espace.

Edit: Comme d'autres l'ont souligné, cette solution a des problèmes pour faire correspondre les nouvelles lignes entre les mots. Ce n'est pas présent dans l'exemple, mais on peut facilement voir comment cette situation pourrait se produire. Une alternative consiste à procéder comme suit:

$string = trim(preg_replace('/\s+/', ' ', $string));
jwueller
la source
10
Avant d'utiliser cette solution, consultez ma réponse ci-dessous et les commentaires de ma réponse. Cette solution peut ne pas fonctionner comme prévu.
matsolof
1
dans l'expression régulière "\ s Correspond à un espace", pourquoi correspondrait-il à une nouvelle ligne?
Michael Z
2
Je cherchais une solution pour supprimer / remplacer tous les espaces blancs mais pas les espaces (doubles). Voici l'expression /(?![ ])\s+/
régulière
Je voulais juste vous faire savoir que votre solution m'a fait gagner beaucoup de temps.
Parthapratim Neog
183

Quelques commentaires sur la réponse acceptée:

Le +moyen "1 ou plus". Je ne pense pas que vous ayez besoin de répéter \s. Je pense que vous pouvez simplement écrire '/\s+/'.

En outre, si vous souhaitez supprimer les espaces en premier et en dernier de la chaîne, ajoutez trim.

Avec ces modifications, le code serait:

$string = preg_replace('/\s+/', ' ', trim($string));
matsolof
la source
Vous avez raison; /\s\s+/ne correspondrait pas au saut de ligne foo\nbar.
Alan Moore
79

Utilisez simplement preg_replace()

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

Vous pouvez vous en sortir avec str_replace()celui-ci, bien que le code ne semble pas aussi propre:

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

Voir en direct sur ideone

NullUserException
la source
1
OP veut un espace entre "paragraphes" et "pour". Si vous supprimez simplement les caractères de nouvelle ligne, il n'y en aura pas.
Daniel Vandersluis
veuillez corriger cela pour$string = preg_replace("~[\r\n]~", "",$string);
erikbwork
Sinon, il n'y a plus rien à dire. c'est la réponse la plus simple, je pense!
erikbwork
3
@erik Je serais alors en train de le "corriger". Cela fonctionne bien comme ça.
NullUserException
1
@Vineet Ce n'est qu'un délimiteur indiquant le début et la fin de l'expression
régulière
21
$string = str_replace(array("\n", "\r"), ' ', $string);
fabrik
la source
3
Les séquences d'échappement en PHP doivent être entre guillemets.
Daniel Vandersluis
Cela ne fait pas exactement ce que l'OP veut, car c'est la même chose que la réponse insaisissable et cela ne supprime pas les \rcaractères
NullUserException
@NullUser: Pourquoi ne mettez-vous pas à jour votre propre message au lieu de commenter cela?
Fabrik
@NullUser: Sauf le fait qu'il remplace tout par '' au lieu de ''.
Fabrik
12

Vous devez utiliser str_replace pour sa vitesse et utiliser des guillemets doubles avec un tableau

str_replace(array("\r\n","\r"),"",$string);
RobertPitt
la source
Faible en ressources, parfait, tks.
CONvid19
1
Je me trompe peut-être, mais ce code ne supprime pas le nouveau caractère de ligne sur les systèmes Unix parce que sur ces systèmes, la nouvelle ligne est juste \net pas \r\nplus, je pense que l'OP demande de mettre un seul espace à la place des nouvelles lignes
Marco Demaio
7

Je ne sais pas si cela a une valeur par rapport aux réponses déjà soumises, mais je peux tout aussi bien le poster.

// 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
la source
6

Les remplacements de regex PCRE peuvent être effectués à l'aide de preg_replace: http://php.net/manual/en/function.preg-replace.php

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

Remplacerait une nouvelle ligne ou retournerait des caractères par un espace. Si vous ne voulez rien pour les remplacer, remplacez le 2e argument par ''.

n00dle
la source
1
Les pregfonctions utilisent des expressions régulières PCRE et non POSIX. Il existe des eregfonctions qui utilisent POSIX, mais elles sont désormais obsolètes.
Daniel Vandersluis
5

Utilisez ceci:

remplacer la série de sauts de ligne par une chaîne vide:

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

ou vous voulez probablement remplacer les sauts de ligne par un seul espace:

$string = preg_replace("/[\\n\\r]+/", " ", $string);
netom
la source
Veuillez formater votre code correctement. Cela se fait en mettant en retrait la ligne concernée de quatre espaces.
jwueller
2
C'est pourquoi j'utilise des guillemets simples, donc je n'ai pas besoin d'échapper à ces caractères. \\nsemble terrible. \\\\ correspondre à une seule barre oblique inverse est tout simplement horrible.
NullUserException
5

La séquence d'échappement\R correspond à une nouvelle ligne générique

c'est-à-dire tout ce qui est considéré comme une séquence de saut de ligne par Unicode. Cela inclut tous les caractères correspondant à \v( espace vertical ) et la séquence multi-caractères \x0D\x0A...

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

En mode 8 bits non UTF-8 \Rest équivalent à ce qui suit: (?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

Regex101 Demo

Anton
la source
Anton s'il vous plaît vérifier, si mon montage est correct! Ajout d'informations supplémentaires.
Bobble bubble
4

Les sauts de ligne dans le texte sont généralement représentés comme suit:

\ r \ n - sur un ordinateur Windows

\ r - sur un ordinateur Apple

\ n - sous Linux

//Removes all 3 types of line breaks

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

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

De quoi s'agit-il:

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

Cela devrait être une solution assez robuste car \ n ne fonctionne pas correctement dans tous les systèmes si je ne me trompe pas ...

GDY
la source
Cela ne semble pas remplacer \ r mais juste \ n: ideone.com/28KPcb
T30
Comme mentionné dans le manuel, PHP_EOL contient le symbole de fin de ligne correct pour la plate-forme actuelle. Si vous importez des chaînes à partir d'autres plates-formes ou si vous avez simplement des chaînes formatées incorrectes, cela peut se casser.
GDY
Si vous avez un environnement assez fermé, cela semble être la solution la plus élégante pour moi car sa plate-forme est indépendante et probablement assez performante ... si vous avez une entrée plus large comme des scénarios d'importation / exportation, vous devriez probablement utiliser une solution regex.
GDY
3

J'ai été surpris de voir à quel point tout le monde en sait peu sur les regex.

Strip newlines en php est

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

En perl

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

Signification remplacer tout caractère de nouvelle ligne à la fin de la ligne (pour plus d'efficacité) - éventuellement précédé d'un retour chariot - par un espace.

\ n ou \ 015 est une nouvelle ligne. \ r ou \ 012 est le retour chariot. ? en expression régulière signifie correspondre à 1 ou zéro du caractère précédent. $ en regex signifie correspondre à la fin de la ligne.

La référence originale et la meilleure regex est perldoc perlre, chaque codeur devrait bien connaître ce document: http://perldoc.perl.org/perlre.html Notez que toutes les fonctionnalités ne sont pas prises en charge par toutes les langues.

ekerner
la source
Cette solution n'a pas fonctionné pour moi mais comme mentionné, je devrai en lire plus pour produire la solution réelle. J'ai été surpris que cela ne fonctionne pas.
Adam Whateverson du
2

c'est le modèle que j'utiliserais

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

peut-être que cela fonctionne:

$str='\n';
echo str_replace('\n','',$str);
زياد
la source
1

Celui-ci supprime également les onglets

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

Vous pouvez essayer ci-dessous le code conservera tous les espaces blancs et les nouvelles lignes dans votre texte.

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

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

Beaucoup de ces solutions n'ont pas fonctionné pour moi. Cela a cependant fait l'affaire: -

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

Voici la référence: - PCRE et New Lines

Adam Whateverson
la source
0

ce code ci-dessous fonctionne tout le texte, veuillez l'utiliser:

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

la source
0

Vous pouvez supprimer une nouvelle ligne et plusieurs espaces blancs.

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

echo $name;
Ramesh
la source