Comment supprimer les sauts de ligne (pas de caractères!) De la chaîne?

146

Cela peut sembler une dupe, mais soyez assurés que ce n'est pas le cas - j'ai cherché à la fois SO ainsi que le reste du Web pour une réponse à mon problème et j'ai fini par trouver les mêmes «solutions» insuffisantes encore et encore. Quoi qu'il en soit, voilà:

J'enregistre les entrées utilisateur d'une zone de texte dans une base de données MySQL (dans un environnement WordPress, mais cela ne devrait pas avoir d'importance pour ce problème, je crois). Il est ensuite récupéré de la base de données pour être montré aux administrateurs dans le backend du site. Le problème se produit lorsque les utilisateurs soumettent du texte avec des sauts de ligne (c'est-à-dire appuyez sur la touche Entrée).

Un exemple de chaîne peut ressembler à ceci:

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

Greetings,
Bill

Il n'y a pas de caractères de fin de ligne ("\ n", "\ r" ou autre) dans la chaîne.

J'utilise nl2br()dessus pour générer une sortie HTML, mais ce n'est pas suffisant. Le résultat est alors:

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

Quel est, pour autant que je sache, le nl2br()résultat attendu , car cela insère les balises et n'est pas censé remplacer les sauts de ligne en premier lieu?

Cependant, le format dont j'ai besoin serait le suivant:

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

Si la chaîne contenait des caractères EOL tels que "\ n", je la frapperais avec str_replace()ou preg_replace()et en finirais avec, mais je n'ai aucune idée de l'aiguille pour alimenter l'une de ces fonctions s'il n'y a pas de caractères là en premier lieu.

Je peux accéder manuellement au champ pertinent dans la base de données, appuyez sur Retour arrière pour chaque saut de ligne et ce que je veux faire plus tard avec la chaîne fonctionne. Je sais donc que j'ai besoin du format ci-dessus.

Johannes Pille
la source
Si la chaîne ressemble à votre premier exemple, comment pouvez-vous dire qu'elle ne contient aucun caractère de saut de ligne? Il en a au moins deux: deux d'affilée après "merci!"
Ernest Friedman-Hill
Juste enuff @ ErnestFriedman-Hill, vous avez évidemment raison - il y a "quelque chose" là-bas, ce n'est simplement ni visible, ni rien de ce que je sais.
Johannes Pille
Je ne vois pas non plus comment il est possible d'avoir de nouvelles lignes sans caractères de saut de ligne. Pouvez-vous utiliser un éditeur hexadécimal pour inspecter la chaîne - Je suis sûr que vous trouverez les caractères pour les nouvelles lignes ...
nettle

Réponses:

376

Vous devriez pouvoir le remplacer par un preg qui supprime toutes les nouvelles lignes et les retours chariot. Le code est:

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

Même si les \ncaractères n'apparaissent pas, si vous obtenez des retours chariot, il y a un caractère invisible. Le remplacement des preg devrait les saisir et les réparer.

Ben Roux
la source
Incroyable. J'aurais juré d'avoir tout essayé dans le sens de la vôtre et des réponses @bsdnoobz, qui font toutes les deux le travail. Eh bien, quel que soit le blocage mental que j'ai eu là-bas, vous m'avez tous les deux fait gagner beaucoup de temps. S'est avéré être une question assez stupide, je suppose. Merci les gars!
Johannes Pille
3
Notez que cela ne correspondra pas à tous les sauts de ligne, c'est-à-dire à ceux créés sur les systèmes Windows. Pour les attraper, vous pouvez utiliser le RegEx suivant à la place/\r|\n|\r\n/
Toastrackenigma
6
use \ R (qui représente n'importe quelle séquence de fin de ligne) stackoverflow.com/a/16274784/1491212
Armel Larcier
435

La solution de Ben est acceptable, mais str_replace () est de loin plus rapide que preg_replace ()

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

En utilisant moins de puissance CPU, réduit les émissions mondiales de dioxyde de carbone

Demis Palma ツ
la source
5
Je ne peux pas croire que cette réponse ne soit pas plus crédible. 100 pouces vers le haut sur preg_replace ()
pimbrouwers
62
IMPORTANT: utilisez des guillemets doubles autour des codes de retour chariot et de nouvelle ligne. Ceux-ci ne seront pas traités correctement si vous utilisez des guillemets simples!
bwright
47
Bravo -> "Utiliser moins de puissance CPU, réduit les émissions mondiales de dioxyde de carbone."
Jan
3
@Joeri: Ce dernier ne sera jamais appelé car il serait géré par les deux premiers. C'est du code redondant.
nightfox89
4
@Joeri Considérant que str_replace supprime toutes les occurrences, est-ce que \ r et \ n tous les deux ne seraient pas supprimés de toute façon?
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
sans flux
la source
11

C'est parce nl2br()que ne supprime pas du tout les nouvelles lignes.

Chaîne de retour avec <br />ou <br> inséré avant tous les sauts de ligne ( \r\n, \n\r, \net \r).

Utilisez à la str_replaceplace:

$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
Kenorb
la source
7

Vous pouvez également utiliser PHP Trim

Cette fonction renvoie une chaîne dont les espaces sont supprimés du début et de la fin de str. Sans le deuxième paramètre, trim () supprimera ces caractères:

  • "" (ASCII 32 (0x20)), un espace ordinaire.
  • "\ t" (ASCII 9 (0x09)), un onglet.
  • "\ n" (ASCII 10 (0x0A)), une nouvelle ligne (saut de ligne).
  • "\ r" (ASCII 13 (0x0D)), un retour chariot.
  • "\ 0" (ASCII 0 (0x00)), l'octet NUL.
  • "\ x0B" (ASCII 11 (0x0B)), une tabulation verticale.
Gijs de Jong
la source
3
Cela ne ciblera que les nouvelles lignes au début et à la fin de la chaîne. Les retours à la ligne au milieu de la chaîne ne seront pas modifiés.
mickmackusa
6

Pour fonctionner correctement également sur Windows, je suggère d'utiliser

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

"\r\n"- pour Windows, "\r"- pour Mac et "\n"- pour Linux

Ajjaah
la source
2
Désolé mon pote, mais même après avoir été celui qui a demandé en 2012, je peux vous dire avec une certitude absolue que c'est redondant. Posez-vous la question suivante: Si tous \ret \nsont supprimés dans la chaîne, pourquoi ne serait-ce pas le cas pour ceux qui se succèdent directement?
Johannes Pille du
Vraiment, cette chose évidente ne m'est pas venue à l'esprit ... Merci :) Je viens de réaliser que j'ai eu des problèmes avec ça, mais c'était l'inverse, je l'ai utilisé \r\nsous Windows et ça n'a pas fonctionné sous Linux.
Ajjaah
Eh bien, j'utilise cette fonction pour remplacer les sauts de ligne par des virgules, donc une adresse est un texte sur une seule ligne, donc remplacer \r\nFIRST aiderait, car cela signifie une virgule plutôt que deux pour chaque partie si ce saut de ligne
Martin
@Martin Oui, vous avez raison, je viens de réaliser la même chose, donc nous remplaçons d' \r\nabord, puis nous remplaçons \ret \n, j'ai édité ma réponse.
Ajjaah
Ceci est toujours redondant, si vous allez supprimer tous les \ret \r, il n'est pas nécessaire de supprimer \r\n, vous pouvez l'utilisateur str_replace(array("\r","\n"), "", $buffer);pour obtenir le même résultat.
stramin le
6

str_replace (PHP_EOL, null, $ str);

Rafanake
la source
1
alors que cela peut répondre à la question. Il est conseillé d'expliquer un peu votre réponse.
Anirudh Sharma
PHP_EOL ne fonctionne pas toujours lorsque vous lisez une chaîne. C'est le cas lorsque vous les écrivez.
nightfox89
Les réponses basées uniquement sur le code sont de faible valeur sur StackOverflow car elles font très peu pour éduquer l'OP et les futurs lecteurs.
mickmackusa
4

Quelque chose d'un peu plus fonctionnel (facile à utiliser n'importe où):

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

Utiliser PHP_EOL comme paramètre de remplacement de recherche est également une bonne idée! Gloire.

tfont
la source
1

Alternative intégrée: 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.

Il est là pour supprimer les sauts de ligne de différents types de fichiers texte, mais ne gère pas le HTML.

NVRM
la source
0

J'utilise 3 lignes pour faire ce travail, alors considérez $ s comme votre "truc" ...

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