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?
3 Réponses :
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é.
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.
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.
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);
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.