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 ";

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));

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));

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


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);

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);

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);

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 ''.


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);

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 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);

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 ...


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.


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);

2

peut-être que cela fonctionne:

$str='\n';
echo str_replace('\n','',$str);

1

Celui-ci supprime également les onglets

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

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 );

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


0

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

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

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;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.