web-dev-qa-db-fra.com

Remplacer \ r \ n par PHP

J'ai un formulaire de publication, qui insère mon texte dans une base de données MySQL.

J'utilise

$post_text = mysql_real_escape_string(htmlspecialchars($_POST['text']));

et souhaitez remplacer le \r\n qui a été ajouté automatiquement.

J'ai essayé

$text = str_replace('\\r\\n','', $text);
$text = str_replace('\r\n','', $text);
$text = str_replace('\\R\\N','', $text);
$text = str_replace('\R\N','', $text);
$text = str_replace('/\r\\n','', $text);
$text = str_replace('/r/n','', $text);
$text = str_replace('/\R\\N','', $text);
$text = str_replace('/R/N','', $text);

mais \r\n est toujours inclus dans mes entrées de base de données.

Comment puis-je réparer cela?

32
njaknjak

Le problème principal que vous avez avec toutes les variantes que vous avez essayées est que \n Et \r Sont des caractères d'échappement qui sont échappés uniquement lorsque vous les utilisez dans une chaîne entre guillemets doubles).

En PHP, il y a une grande différence entre '\r\n' Et "\r\n". Notez les guillemets simples dans le premier et les guillemets doubles dans le second.

Ainsi: '\r\n' Donnera une chaîne de quatre caractères contenant une barre oblique, un 'r', une autre barre oblique et un 'n', tandis que "\r\n" Contiendra deux caractères, ceux-ci étant la nouvelle ligne et caractères de retour chariot.

Donc, la réponse directe à votre question est que vous devez utiliser le deuxième des exemples que vous avez donnés dans la question, mais avec des guillemets doubles au lieu de guillemets simples:

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

Il convient de noter que cela supprimera tous les nouvelles lignes de l'entrée et les remplacera par rien. S'il y a plus d'une nouvelle ligne dans l'entrée, elles seront toutes supprimées. Sans en savoir plus sur votre candidature, je ne sais pas si c'est ce que vous voulez, mais voici quelques réflexions:

  • Si vous souhaitez uniquement supprimer les lignes vides (et les autres espaces blancs) de la chaîne end de la chaîne d'entrée, vous pouvez utiliser la fonction trim() à la place.

  • Si vous souhaitez conserver la mise en forme pour la sortie au format HTML, la fonction nl2br() vous aidera. Si vous souhaitez exporter au format HTML sans la mise en forme, vous n'aurez peut-être pas besoin de les supprimer, car le navigateur ne rendra pas les sauts de ligne à partir des caractères\n.

  • Si vous remplacez les nouvelles lignes par rien, selon votre exemple, le dernier mot de la première ligne s'exécutera désormais directement dans le premier mot de la deuxième ligne, etc. Vous préférerez peut-être les remplacer par un caractère espace plutôt que rien.

  • Il est possible que les utilisateurs puissent soumettre l'entrée avec seulement \n Sans le \r Correspondant, ou vice-versa (cela peut être dû à leur système d'exploitation ou navigateur, ou à un piratage délibéré ou à un nombre d'autres raisons). Si vous souhaitez remplacer toutes les instances de ces deux caractères, une manière plus fiable de le faire serait de les remplacer individuellement, plutôt que de vous fier à ce qu'elles soient côte à côte. str_replace() vous permet de le faire en les spécifiant dans un tableau. Vous pouvez également utiliser strtr() ou preg_replace() pour atteindre le même objectif.

J'espère que cela pourra aider.

59
Spudley

essayez aussi

$text = str_ireplace(array("\r","\n",'\r','\n'),'', $text);
11
   if (!is_numeric($value)) {
        $value = mysql_real_escape_string(trim($value));
        $value = str_replace("\\r\\n",'', $value);
    }
5
Vineesh Kalarickal

Je suggère d'utiliser strtr () pour plusieurs remplacements lorsque vous traitez des entrées de base de données. Utilisez également des guillemets doubles comme l'a suggéré @Spudley.

$text = strtr($text, array(
          "\r\n" => "",
          "\r" => "",
          "\n" => "",
          "\t" => " "));

strtr () -> Une fois qu'une sous-chaîne a été remplacée, sa nouvelle valeur ne sera plus recherchée.

http://php.net/strtr

str_replace () -> Si search est un tableau et replace est une chaîne, alors cette chaîne de remplacement est utilisée pour chaque valeur de recherche. L'inverse n'aurait cependant pas de sens.

http://php.net/str_replace

2
fat_mike

Pour conserver plusieurs sauts de ligne, je fais ceci:

$tempCONTENT = mysqli_real_escape_string($con, $_POST['promotion_content']);
$tempCONTENT = str_ireplace(array("\r\n","\r","\n",'\r','\n'),'<br />', $tempCONTENT);
$previewFORMATTED = str_ireplace(array('<br /><br />'),'<br />', $tempCONTENT);
echo $previewFORMATTED;

Il est utilisé pour traiter un champ de formulaire de zone de texte. Il préserve le nombre de sauts de ligne des entrées utilisateur, en les changeant de\r\n en [br /]

J'utilise ceci pour afficher l'entrée afin que l'utilisateur puisse la vérifier avant de l'ajouter à la base de données. L'utilisation de deux boutons de soumission, l'un pour vérifier et l'autre pour soumettre, cela ne fait pas cela. Il ajoute simplement les données en utilisant mysqli_real_escape_string

J'utilise ensuite un str_ireplace pour reconvertir le nombre correct de [br /] en\r\n afin que je puisse répercuter le résultat dans la zone de texte pour le rendre facile à modifier.

Donc, mon code final ressemble à ceci:

$tempCONTENT = mysqli_real_escape_string($con, $_POST['promotion_content']);
$tempCONTENT = str_ireplace(array("\r\n","\r","\n",'\r','\n'),'<br />', $tempCONTENT);
$previewFORMATTED = str_ireplace(array('<br /><br />'),'<br />', $tempCONTENT);
echo $previewFORMATTED;
$formOUTPUT = str_ireplace(array('<br />'),"\r\n", $previewFORMATTED);

J'ai testé cela sur Safari et Chrome et cela fonctionne très bien. Je n'ai pas testé IE, mais rien ne fonctionne jamais sur IE!

Mais j'ai trouvé un autre problème. Si l'utilisateur entre du HTML comme ceci:

<h1>heading</h1><p>some text</p>

c'est bien, mais s'ils font ce qui suit (ce qui est plus probable)

<h1>heading</h1>
<p>some text</p>

Ensuite, j'obtiens un espace énorme entre le titre et le paragraphe.

J'ai essayé de le réparer avec ce code:

$tempCONTENT = str_ireplace(array(">\r\n<",">\r<",">\n<",'>\r<','>\n<'),'><', $tempCONTENT);

mais cela n'a pas fonctionné :( Je reçois toujours l'énorme écart car il ajoute un supplément [br /] entre les balises h1 et p.

Pour l'instant, je vais juste leur dire de ne pas ajouter de saut de ligne entre les balises html et le résultat devrait être bon :)

J'espère que quelqu'un a trouvé cela utile.

0
Steve Hall