Discussion:
nl2br qui me pollue mon balisage html
(trop ancien pour répondre)
SAM
2011-03-20 17:11:45 UTC
Permalink
Salutatous,

1 an 1/2 que je ne suis venu ...

Question :
comment dire au PHP de ne pas m'écrire de balise auto-fermante (<br />)
quand on emploi la fonction : nl2br()

Par exemple :

print "<dd>".nl2br(stripslashes($texte[$i]))."</dd>";

où je voudrais obtenir en html :

<dd>blabla 1<br>
blabla suivant<br>
final</dd>

ces balises auto-fermantes ne font pas propre en html "normal"
et le Validator râlotte un peu à ce sujet.

Si par la même occasion il y avait une astuce pour avoir :

<dd>blabla 1<br>
blabla suivant<br>
final</dd>

au lieu de :

<dd>blabla 1<br>
blabla suivant<br>
final</dd>

qui ne fait très propre non plus dans le code html indenté,
ce serait super !
--
Stéphane Moriaux avec/with iMac-intel
Olivier Miakinen
2011-03-20 18:03:28 UTC
Permalink
Bonjour,
Post by SAM
comment dire au PHP de ne pas m'écrire de balise auto-fermante (<br />)
quand on emploi la fonction : nl2br()
print "<dd>".nl2br(stripslashes($texte[$i]))."</dd>";
<dd>blabla 1<br>
blabla suivant<br>
final</dd>
ces balises auto-fermantes ne font pas propre en html "normal"
et le Validator râlotte un peu à ce sujet.
Avoir <br> au lieu de <br />, c'est possible depuis PHP 5.3.0 (ou avant
PHP 4.0.5 ;-) ) :

<http://fr2.php.net/nl2br>
nl2br(stripslashes($texte[$i]), false)
Post by SAM
<dd>blabla 1<br>
blabla suivant<br>
final</dd>
<dd>blabla 1<br>
blabla suivant<br>
final</dd>
qui ne fait très propre non plus dans le code html indenté,
ce serait super !
Dans ce cas, le plus simple, c'est d'utiliser str_replace() plutôt que
nl2br() :

str_replace("\n", "<br>\n ", stripslashes($texte[$i]))

(mettre autant d'espaces ou de tabulations que nécessaire)


Cordialement,
--
Olivier Miakinen
SAM
2011-03-21 08:07:08 UTC
Permalink
Post by Olivier Miakinen
Bonjour,
Post by SAM
comment dire au PHP de ne pas m'écrire de balise auto-fermante (<br />)
quand on emploi la fonction : nl2br()
Avoir<br> au lieu de<br />, c'est possible depuis PHP 5.3.0 (ou avant
avant, OK
mais depuis ... ha ?
Post by Olivier Miakinen
<http://fr2.php.net/nl2br>
nl2br(stripslashes($texte[$i]), false)
Ha? tout simplement ?
Et ils ne me l'avaient pas dit ! ?
Ces coquins l'ont rajouté depuis mon passage ?

Merci pour le décilage.
Post by Olivier Miakinen
Post by SAM
<dd>blabla 1<br>
blabla suivant<br>
final</dd>
<dd>blabla 1<br>
blabla suivant<br>
final</dd>
qui ne fait très propre non plus dans le code html indenté,
ce serait super !
Dans ce cas, le plus simple, c'est d'utiliser str_replace() plutôt que
str_replace("\n", "<br>\n ", stripslashes($texte[$i]))
(mettre autant d'espaces ou de tabulations que nécessaire)
Oui, bon, ben, je croyais le PHP plus "intelligent"
(avec 70 fonctions autour des fichiers, y aurait pu y en avoir pour
l'indentation)

D'autant que je rencontre d'autres problèmes avec
str_replace("\n", '<br>')
str_replace('<br>', "\n")
--
Stéphane Moriaux avec/with iMac-intel
Mickael Wolff
2011-03-21 10:20:06 UTC
Permalink
Post by SAM
Oui, bon, ben, je croyais le PHP plus "intelligent"
(avec 70 fonctions autour des fichiers, y aurait pu y en avoir pour
l'indentation)
Tu peux invoquer l'utilitaire indent s'il est présent sur le système
;) Ou encore, utiliser DomDocument et forcer une sortie indentée
(propriété DomDocument::formatOutput). Mais je doute que ça te convienne.
SAM
2011-03-21 18:45:01 UTC
Permalink
Post by SAM
Oui, bon, ben, je croyais le PHP plus "intelligent"
(avec 70 fonctions autour des fichiers, y aurait pu y en avoir pour
l'indentation)
utiliser DomDocument et forcer une sortie indentée (propriété
DomDocument::formatOutput). Mais je doute que ça te convienne.
Heu ... ici :
<http://fr2.php.net/manual/fr/class.domdocument.php>
ils ont du mal à me parler de formatOutput
et ...
ça n'a pas l'air si simple, non ?
S'il faut créer et remplir tous les DomElements ...

(à partir de contenu de variables transmises par un form en post, pour
mon soucis du moment.)
--
Stéphane Moriaux avec/with iMac-intel
Mickael Wolff
2011-03-22 06:11:23 UTC
Permalink
Post by SAM
<http://fr2.php.net/manual/fr/class.domdocument.php>
ils ont du mal à me parler de formatOutput
<http://www.php.net/manual/fr/class.domdocument.php#domdocument.props.formatoutput>
Post by SAM
et ...
ça n'a pas l'air si simple, non ?
S'il faut créer et remplir tous les DomElements ...
Ça dépend. Tu peux faire une bouille infâme et utiliser
DomDocument::loadHTML pour charger la chaîne et laisser le DOM rééduquer
le contenu et le cracher avec DomDocument::saveHTML.

D'ailleurs, à propos de bouille, je viens aussi de penser à Tidy qui
peut corriger ton code et le rendre plus HTML compatible.

Bref, c'est comme pour les fichiers, il y a plétore ;)
Olivier Miakinen
2011-03-21 19:40:54 UTC
Permalink
Post by SAM
Post by Olivier Miakinen
str_replace("\n", "<br>\n ", stripslashes($texte[$i]))
(mettre autant d'espaces ou de tabulations que nécessaire)
Oui, bon, ben, je croyais le PHP plus "intelligent"
(avec 70 fonctions autour des fichiers, y aurait pu y en avoir pour
l'indentation)
La voici :

function nltobr($string, $is_xhtml = true, $indent = "")
{
$br = $is_xhtml ? "<br />" : "<br>";
return str_replace("\n", "$br\n$indent", $string);
}

Et si tu veux une fonction qui prenne un paramètre entier pour
$indent qui soit un nombre d'espaces, ça peut se faire aussi
(en deux lignes également, sans boucle).

Je peux même faire une fonction qui accepte aussi bien un entier
qu'une chaîne, et qui fasse le traitement approprié. Mais là il
doit me falloir deux ou trois lignes de code en plus.
Post by SAM
D'autant que je rencontre d'autres problèmes avec
str_replace("\n", '<br>')
str_replace('<br>', "\n")
Lesquels ?


Cordialement,
--
Olivier Miakinen
SAM
2011-03-22 06:11:23 UTC
Permalink
Post by Olivier Miakinen
Post by SAM
(avec 70 fonctions autour des fichiers, y aurait pu y en avoir pour
l'indentation)
La 72 ième fonction ?
Post by Olivier Miakinen
function nltobr($string, $is_xhtml = true, $indent = "")
{
$br = $is_xhtml ? "<br />" :"<br>";
return str_replace("\n", "$br\n$indent", $string);
}
Trop cool !
Dans mon Apache à moi j'ai fait :

echo "
<p>".nltobr(stripslashes(strip_tags($texte)), false, "\t ");

ça a fonctionné nickel !
($texte sur 3 lignes)
Post by Olivier Miakinen
Et si tu veux une fonction qui prenne un paramètre entier pour
$indent qui soit un nombre d'espaces, ça peut se faire aussi
(en deux lignes également, sans boucle).
Je peux même faire une fonction qui accepte aussi bien un entier
qu'une chaîne, et qui fasse le traitement approprié. Mais là il
doit me falloir deux ou trois lignes de code en plus.
Pas trop compris ce que tu veux dire ?!
Post by Olivier Miakinen
Post by SAM
D'autant que je rencontre d'autres problèmes avec
str_replace("\n", '<br>')
str_replace('<br>', "\n")
J'ai malheureusement oublié.
C'était il y a un bail ! Rends-toi compte : samedi

Je me sers d'un fichier texte pour mémoriser(enregistrer) un retour de
formulaire après affichage de ses variables en html (genre wisiwig)
txt-du-form --> html --> txt-pour-fichier
et le str_replace semblait se mélanger les pinceaux.

Autant j'ai un pb avec les retours de ligne du fichier mémoire ?
(mon éditeur texte, par exemple, me propose 3 types de retour de lignes
: Mac, Unix, Windows)
--
Stéphane Moriaux avec/with iMac-intel
Olivier Miakinen
2011-03-22 12:02:18 UTC
Permalink
Post by SAM
Post by Olivier Miakinen
function nltobr($string, $is_xhtml = true, $indent = "")
{
$br = $is_xhtml ? "<br />" :"<br>";
return str_replace("\n", "$br\n$indent", $string);
}
[...]
Post by Olivier Miakinen
Et si tu veux une fonction qui prenne un paramètre entier pour
$indent qui soit un nombre d'espaces, ça peut se faire aussi
(en deux lignes également, sans boucle).
Je peux même faire une fonction qui accepte aussi bien un entier
qu'une chaîne, et qui fasse le traitement approprié. Mais là il
doit me falloir deux ou trois lignes de code en plus.
Pas trop compris ce que tu veux dire ?!
Finalement, je n'ai besoin que d'une seule ligne supplémentaire :

function nltobr($string, $is_xhtml = true, $indent = "")
{
$br = $is_xhtml ? "<br />" : "<br>";
if (is_int($indent)) $indent = sprintf("%*s", $indent, "");
return str_replace("\n", "$br\n$indent", $string);
}

... ou trois, selon le style de codage :

function nltobr($string, $is_xhtml = true, $indent = "")
{
$br = $is_xhtml ? "<br />" : "<br>";
if (is_int($indent)) {
$indent = sprintf("%*s", $indent, "");
}
return str_replace("\n", "$br\n$indent", $string);
}

Si tu passes un nombre entier comme valeur de $indent, mettons le
nombre 3 par exemple, alors il sera remplacé par 3 espaces. Si tu
passes le nombre 8, il sera remplacé par 8 espaces. Mais j'ai vu
que ça ne correspondait pas à ton besoin puisque tu veux mélanger
des espaces et des tabulations.
Post by SAM
Post by Olivier Miakinen
Post by SAM
D'autant que je rencontre d'autres problèmes avec
str_replace("\n", '<br>')
str_replace('<br>', "\n")
J'ai malheureusement oublié.
C'était il y a un bail ! Rends-toi compte : samedi
;-)
Post by SAM
[...]
Autant j'ai un pb avec les retours de ligne du fichier mémoire ?
(mon éditeur texte, par exemple, me propose 3 types de retour de lignes
: Mac, Unix, Windows)
C'est possible. J'ai déjà vu des cas où la conversion était faite
automatiquement entre le "\n" traité dans le programme et le "\r\n"
écrit ou lu sur le disque ou sur le réseau, mais ce n'est peut-être
pas le cas partout.

Cordialement,
--
Olivier Miakinen
SAM
2011-03-22 22:56:23 UTC
Permalink
Post by Olivier Miakinen
Post by SAM
Post by SAM
D'autant que je rencontre d'autres problèmes avec
str_replace("\n", '<br>')
Autant j'ai un pb avec les retours de ligne du fichier mémoire ?
(mon éditeur texte, par exemple, me propose 3 types de retour de lignes
: Mac, Unix, Windows)
C'est possible. J'ai déjà vu des cas où la conversion était faite
automatiquement entre le "\n" traité dans le programme et le "\r\n"
écrit ou lu sur le disque ou sur le réseau, mais ce n'est peut-être
pas le cas partout.
en fait ce serait à propos de l'exploitation du retour d'un textarea :

[code]
<form action="nltobr.php" method="post">
<div>
<textarea name="texto" cols=70 rows=10>Magnifique vêtement très chaud.
Disponible en toutes tailles.
Coton et plumes.
Réversible</textarea>
<p><input type=submit></p>
</div>
</form>
<?php
foreach ($_REQUEST as $key => $val) { $$key = $val; }

function nltobr($string, $is_xhtml, $indent) {
$br = $is_xhtml ? "<br />" : "<br>";
return str_replace("\n", "$br\n$indent", $string);
}

if(isset($texto) && !empty($texto)) {
echo "
<p>".nltobr(stripslashes(strip_tags($texto)), false, "\t ")."
</p>";
}
?>
[/code]

L'echo ci-avant me donne
(avec n'importe quel type de retour de ligne, Mac/Unix/Windows) :

<p>Magnifique vêtement très chaud.
<br>
Disponible en toutes tailles.
<br>
Coton, plumes d'autruche.
<br>
Réversible
</p>

il reste un retour avant le <br>


tandis que :

<?php
$texte = 'Magnifique vêtement très chaud.
Disponible en toutes tailles.
Coton et plumes.
Réversible';
echo "
<p>".nltobr(stripslashes(strip_tags($texte)), false, "\t ")."
</p>";
?>

me donne :
<p>Magnifique vêtement très chaud.<br>
Disponible en toutes tailles.<br>
Coton, plumes d'autruche.<br>
Réversible
si le fichier php a été édité avec retours Unix

ou me donne :
<p>Magnifique vêtement très chaud.
Disponible en toutes tailles.
Coton, plumes d'autruche.
Réversible

si édité en "Mac"


Je ne rencontre pas ces difficultés avec nl2br()
... seulement si je suis en Unix ... :-/

<p>Magnifique vêtement très chaud.<br>
Disponible en toutes tailles.<br>
Coton et plumes.<br>
Réversible
</p>

Mébon ... alors ... pas d'indentation.

Tout ça dans l'Apache de mon Mac et avec Firefox.3.6
--
Stéphane Moriaux avec/with iMac-intel
Olivier Miakinen
2011-03-23 00:12:18 UTC
Permalink
Post by SAM
[...]
L'echo ci-avant me donne
Même Unix ?
Post by SAM
<p>Magnifique vêtement très chaud.
<br>
Disponible en toutes tailles.
<br>
Coton, plumes d'autruche.
<br>
Réversible
</p>
il reste un retour avant le <br>
Essaye peut-être avec ceci :

function nltobr($string, $is_xhtml, $indent) {
$br = $is_xhtml ? "<br />" : "<br>";
return preg_replace("/(?>\r\n|\n|\r)/", "$br$0$indent", $string);
}

Ici, au lieu de considérer que le saut de ligne est forcément \n, on
traite n'importe lequel des trois cas possibles \r\n ou \n ou \r.

Attention, ça fonctionnera tant que $indent ne contient que des
caractères « normaux » (tabulation ou espace c'est parfait). Si
jamais tu pensais vouloir l'utiliser un jour avec des « $ » ou des
« \ » dans $indent il faudrait faire un traitement supplémentaire.

Cordialement,
--
Olivier Miakinen
SAM
2011-03-23 17:17:29 UTC
Permalink
Post by Olivier Miakinen
Post by SAM
[...]
L'echo ci-avant me donne
Même Unix ?
Oui.
re-vérifié
(chez moi !)
(c a d sans passer par un soft de ftp pour être mis sur un serveur externe)
Post by Olivier Miakinen
Post by SAM
<p>Magnifique vêtement très chaud.
<br>
Disponible en toutes tailles.
<br>
Coton, plumes d'autruche.
<br>
Réversible
</p>
il reste un retour avant le<br>
function nltobr($string, $is_xhtml, $indent) {
$br = $is_xhtml ? "<br />" :"<br>";
return preg_replace("/(?>\r\n|\n|\r)/", "$br$0$indent", $string);
}
Ça marche !
Faut-il se faire ses biblis de fonctions PhP alors qu'il y a déjà plétore ?

Merci de ta patience.
--
Stéphane Moriaux avec/with iMac-intel
Dominique Ottello
2011-03-20 21:29:13 UTC
Permalink
Post by SAM
comment dire au PHP de ne pas m'écrire de balise auto-fermante (<br />)
quand on emploi la fonction : nl2br()
Avoir le réflexe d'aller lire la documentation :
http://fr2.php.net/manual/fr/function.nl2br.php
--
Ce n'est pas parce qu'ils sont nombreux à avoir tort
qu'ils ont forcément raison. Coluche
SAM
2011-03-21 08:07:08 UTC
Permalink
Post by Dominique Ottello
Post by SAM
comment dire au PHP de ne pas m'écrire de balise auto-fermante (<br />)
quand on emploi la fonction : nl2br()
http://fr2.php.net/manual/fr/function.nl2br.php
Il ne suffit pas de lire, il faut en plus faire attention à tout !
Olivier m'a indiqué le truc 'false' qui m'avait échappé.
--
Stéphane Moriaux avec/with iMac-intel
Continuer la lecture sur narkive:
Loading...