2010-09-21 6 views
207
$string = " 
put returns between paragraphs 

for linebreak add 2 spaces at end 

"; 

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

J'ai cette 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'. Il est presque deux fois plus lent que 'str_replace'. –

+0

Vous pourriez trouver ['s ($ str) -> normalizeLineEndings ('')'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L540) utile , comme dans [cette bibliothèque autonome] (https://github.com/delight-im/PHP-Str). Il enlèvera non seulement LF, CR et CRLF, mais aussi toute nouvelle ligne Unicode. – caw

Répondre

417

Vous devez être prudent des ruptures de ligne double, ce qui entraînerait des espaces doubles. Utilisez cette expression régulière vraiment efficace:

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

Les espaces multiples et les retours à la ligne sont remplacés par un seul espace.

Editer: Comme d'autres l'ont souligné, cette solution a des problèmes pour faire correspondre les nouvelles lignes simples entre les mots. Ceci n'est pas présent dans l'exemple, mais on peut facilement voir comment cette situation pourrait se produire. Une autre solution consiste à effectuer les opérations suivantes:

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

+1 pour l'expression régulière –

+8

Avant d'utiliser cette solution, voir 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 caractère d'espace", pourquoi correspondrait-il à un saut de ligne? –

55

Il suffit d'utiliser preg_replace()

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

Vous pourriez sortir avec str_replace() sur 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. –

+2

le premier ne fonctionne pas – James

+0

s'il vous plaît corriger à '$ string = preg_replace (" ~ [\ r \ n] ~ "," ", $ chaîne);' – erikbwork

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

Les séquences d'échappement en PHP doivent être en double. –

+0

Cela ne fait pas exactement ce que l'OP veut, puisque c'est la même chose que la réponse d'elusive et qu'elle ne supprime pas les caractères '\ r' – NullUserException

+0

@NullUser: Pourquoi ne pas mettre à jour votre propre message au lieu de le commenter? – fabrik

5

PCRE remplacement regex peut être fait en utilisant preg_replace: http://php.net/manual/en/function.preg-replace.php

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

Remplacera nouvelle ligne ou le retour des personnages avec un espace. Si vous ne voulez rien pour les remplacer, remplacez le 2ème argument par ''.

+1

Les fonctions 'preg' utilisent des expressions régulières PCRE, pas POSIX. Il existe des fonctions 'ereg' qui utilisent POSIX, mais elles sont maintenant obsolètes. –

+0

Oops, bon point, désolé! Corriger maintenant. – n00dle

3

Utilisez ceci:

remplacer série de nouvelles lignes avec une chaîne vide:

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

ou vous voulez probablement remplacer les nouvelles lignes avec un seul espace:

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

Veuillez formater correctement votre code. Ceci est fait en indentant la ligne pertinente par quatre espaces. – jwueller

+2

C'est pourquoi j'utilise des guillemets simples, donc je n'ai pas besoin d'échapper ces caractères. '\\ n' semble terrible. '\\\\' correspondre à un seul backslash est juste horrible. – NullUserException

10

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

str_replace(array("\r\n","\r"),"",$string); 
+0

Faible en ressources, parfait, tks. –

1

c'est le modèle que je voudrais utiliser

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

Quelques commentaires sur la réponse acceptée:

Le + signifie « 1 ou plus ». Je ne pense pas que vous devez répéter \s. Je pense que vous pouvez simplement écrire '/\s+/'.

De même, si vous souhaitez supprimer les espaces en premier et en dernier dans la chaîne, ajoutez trim.

Avec ces modifications, le code serait:

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

Vous avez raison; '/ \ s \ s + /' ne correspondrait pas au saut de ligne dans 'foo \ nbar'. –

+2

Bon pour obtenir une confirmation que j'ai raison. Qu'est-ce que "foo" et "bar" signifient, au fait? Je sais qu'ils sont des espaces réservés, mais que signifient réellement les mots? Et ne serait-il pas préférable d'utiliser des mots plus familiers, qui seraient moins déroutants pour les débutants, comme des espaces réservés?Quand j'ai vu "foo" et "bar" pour la première fois dans un tutoriel, je pensais que les mots étaient du code, et il m'a fallu du temps pour comprendre qu'ils ne le sont pas. – matsolof

+1

http://www.urbandictionary.com/define.php?term=foobar – activeDev

1

Escape sequence \R correspond à un saut de ligne générique

qui est, quoi que ce soit considéré comme une séquence linebreak par Unicode. Cela comprend tous les caractères correspondants par \v (espace vertical), et la séquence de caractères multi \x0D\x0A ...

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

à 8-bit mode non-UTF-8 \R est équivalente à ce qui suit : (?>\r\n|\n|\x0b|\f|\r|\x85) ... pcre.org

Regex101 Demo

+0

Anton s'il vous plaît vérifier, si mon édition est ok! Ajouté quelques informations supplémentaires. –

1

Celui-ci supprime également les onglets

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

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

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

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

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

Ce qui est sur:

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

0

Vous pouvez Essayez le code ci-dessous préservera tout espace blanc et de nouvelles lignes dans votre texte.

$str = " 
put returns between paragraphs 

for linebreak add 2 spaces at end 

"; 

echo preg_replace("/\r|\n/", "", $str); 
0

J'ai été surpris de voir à quel point tout le monde connaît peu de regex.

bande de nouvelles lignes de PHP est

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

Dans perl

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

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

\ n ou \ 015 est un retour à la ligne. ou 012 est le retour chariot. ? dans regex signifie correspondre 1 ou zéro du caractère précédent. $ in regex signifie que la fin de la ligne correspond.

L'original et la meilleure référence est regex perldoc perlre, chaque codeur doit savoir ce doc assez bien: http://perldoc.perl.org/perlre.html Remarque Toutes les fonctions sont prises en charge par toutes les langues.

1

peut-être ceci fonctionne:

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