3
votes

Comment conserver les sauts de ligne dans les données POST HTML Textarea

J'essaie de soumettre les paroles d'une chanson dans une zone de texte. Donc, cela doit conserver les sauts de ligne lorsque je produis. Je suis conscient du fait que la norme des navigateurs doit utiliser \ r \ n comme saut de ligne, et la fonction nl2br () de PHP peut convertir le \ r \ n en
.

Je suis également conscient du fait que les entrées textarea nécessitent wrap = "hard" pour passer les sauts de ligne, sinon la valeur par défaut de wrap = "soft" sera ignorée, et que cols = "" doit être spécifié lorsque en utilisant wrap = "hard". J'ai essayé d'accomplir cela avec le html ci-dessous:

array(5) { ["reading_text"]=> string(216) "Line one of the lyrics That were entered into the textarea Alas to my dismay Red eyes and fire and signs Because the line-breaks are not in the POST data" ["add_reading"]=> string(3) "Add" }

Cependant, le tableau POST n'affiche aucun saut de ligne. J'entre ceci dans la zone de texte:

Ligne une des paroles

Qui ont été saisis dans la zone de texte

Hélas à ma grande consternation

Yeux rouges, feu et signes

Parce que les sauts de ligne ne sont pas dans les données POST

Je veux faire un rayon de soleil et ne jamais quitter la maison

Je reçois ceci dans le tableau POST:

<textarea wrap="hard" name="reading_text" cols="450" rows="6" maxlength="5000"></textarea>

Pour rendre les choses plus déroutantes pour moi, j'ai essayé de regarder la démo de W3 Schools ( https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_textarea_wrap a >). Cependant, je n'arrive même pas à faire fonctionner cet exemple. Lorsque j'entre plusieurs sauts de ligne dans la zone de texte, le texte sort sans \r\n.

Que me manque-t-il ici?


2 commentaires

jetez un œil stackoverflow.com/questions/498461/...


J'ai lu cela, mais ce sont simplement les mêmes règles générales. Je n'arrive même pas à obtenir des données sur le serveur avec '\ r \ n' dedans. Si j'ai une zone de texte et que j'utilise wrap = "hard" dans un formulaire et que j'utilise POST, l'élément POST ne devrait-il pas avoir '\ r \ n' dans la chaîne? Ma chaîne n'a pas de \ r \ n.


3 Réponses :


0
votes

Vous pouvez transmettre le texte de la zone de texte dans le cadre de la chaîne de requête. Cela forcera la chaîne entière à être encodée en url comme ceci:

%0AGray%2C%20quiet%20and%20tired%20and%20mean%0A%0APicking%20at%20a%20worried%20seam%0A%0AI%20try%20to%20make%20you%20mad%20at%20me%20over%20the%20phone.%0A%0ARed%20eyes%20and%20fire%20and%20signs%0A%0AI%27m%20taken%20by%20a%20nursery%20rhyme%0A%0AI%20want%20to%20make%20a%20ray%20of%20sunshine%20and%20never%20leave%20home%0A

puis décodera simplement la chaîne sur la page de réception avec urldecode () . Cela devrait conserver le formatage et l'afficher correctement.

http://php.net/manual/en/function .urldecode.php

https: //www.tools4noobs. com / online_php_functions / urldecode /

Je suppose que vous pouvez aussi simplement urlencode () le texte textarea avant POSTING et le urldecode à l'autre extrémité.


0 commentaires

3
votes

En ce qui concerne l'attribut wrap , vous n'en avez pas besoin pour ce que vous essayez d'accomplir. Comme décrit dans la spécification HTML 5.2 , les sauts de ligne dans le texte sont préservés lorsque vous utilisez les options d'attribut soft ou hard .

L'option hard n'est requise que lorsque vous souhaitez limiter la longueur de chaque ligne de l'entrée. Utilisez cette option pour forcer des sauts de ligne supplémentaires partout où votre entrée s'enroule naturellement (c'est-à-dire là où la ligne est plus longue que la valeur définie dans cols ).

Par exemple, si j'ai une zone de texte définie sur cols = "20" wrap = "hard" et que j'entre le texte:

$escaped_newlines = str_replace("\r\n", '\r\n', $_POST['reading_text']);
$escaped_newlines = preg_replace('/\r\n/', '\r\n', $_POST['reading_text']);

La valeur soumise deviendra alors:

This is a long
string that will
exceed the number of
cols in this
textarea

Si j'ai bien compris, vous ne voulez conserver que les sauts de ligne entrés intentionnellement par l'utilisateur; ceux-ci seront capturés à l'aide de l'option soft par défaut.

Concernant le texte soumis , veuillez noter que les caractères d'échappement \ r \ n ne sera pas vu dans la valeur publiée, les caractères de nouvelle ligne sont toujours dans la même forme interprétée que lorsque vous appuyez sur la touche "Entrée" de votre clavier.

Même si vous ne pouvez pas voir les caractères d'échappement, les nouvelles lignes existent et peuvent toujours être trouvées et manipulées par PHP. Comme vous l'avez suggéré, nl2br peut être utilisé pour convertir les nouvelles lignes en éléments de rupture HTML.

Si vous avez réellement besoin de convertir les nouvelles lignes en leurs caractères d'échappement correspondants, peut-être avant de stocker la valeur, alors il y a plusieurs façons de manipuler la chaîne. Quelques exemples:

This is a long string that will exceed the number of cols in this textarea

(Pour plus d'informations, il existe une réponse SO utile sur guillemets simples / doubles et interprétation des nouvelles lignes )

Enfin, comment visualisez-vous actuellement le contenu de $ _POST ? Si vous sortez le contenu de var_dump directement dans le HTML, vous devrez alors envelopper la sortie dans les balises

  afin de voir le sauts de ligne dans le HTML résultant. Mieux encore, effectuez une sortie dans un fichier journal afin que vous n'ayez pas à prendre en compte ces problèmes de rendu. 


2 commentaires

C'est une excellente explication. Maintenant, je comprends exactement les attributs "hard" et "soft" et aussi, comment les sauts de ligne sont interprétés dans le DOM du navigateur et comment stocker ou convertir les données.


Merci également pour la spécification HTML 5.



0
votes

Voici ce qui a finalement résolu le problème: j'utilisais le filtre PHP FILTER_FLAG_STRIP_LOW ( http://php.net/manual/en/filter.filters.flags.php ) sur la chaîne avant de sortir ou de stocker dans la base de données, vous supprimerez les caractères de nouvelle ligne \ r \ n .

Pour résoudre ce problème, vous pouvez utiliser FILTER_FLAG_ENCODE_LOW au lieu de FILTER_FLAG_STRIP_LOW en tant que tel:

$input = filter_var($input, FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_LOW);


0 commentaires