Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

nl2br qui me pollue mon balisage html

13 réponses
Avatar
SAM
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

10 réponses

1 2
Avatar
Olivier Miakinen
Bonjour,

Le 20/03/2011 18:11, SAM a écrit :

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.



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)

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 !



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
Avatar
Dominique Ottello
SAM écrivait :

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
Avatar
SAM
Le 20/03/11 22:29, Dominique Ottello a écrit :
SAM écrivait :

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



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
Avatar
SAM
Le 20/03/11 19:03, Olivier Miakinen a écrit :
Bonjour,

Le 20/03/2011 18:11, SAM a écrit :

Question :
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
PHP 4.0.5 ;-) ) :



avant, OK
mais depuis ... ha ?

<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.


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 !



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)



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
Avatar
Mickael Wolff
On 21/03/11 08:07, SAM wrote:

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.
Avatar
SAM
Le 21/03/11 11:20, Mickael Wolff a écrit :
On 21/03/11 08:07, SAM wrote:

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
Avatar
Olivier Miakinen
Le 21/03/2011 09:07, SAM a écrit :

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", "$brn$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.

D'autant que je rencontre d'autres problèmes avec
str_replace("n", '<br>')
str_replace('<br>', "n")



Lesquels ?


Cordialement,
--
Olivier Miakinen
Avatar
Mickael Wolff
On 21/03/11 18:45, SAM wrote:
Heu ... ici :
<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>

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 ;)
Avatar
SAM
Le 21/03/11 20:40, Olivier Miakinen a écrit :
Le 21/03/2011 09:07, SAM a écrit :



(avec 70 fonctions autour des fichiers, y aurait pu y en avoir pour
l'indentation)



La voici :



La 72 ième fonction ?

function nltobr($string, $is_xhtml = true, $indent = "")
{
$br = $is_xhtml ? "<br />" :"<br>";
return str_replace("n", "$brn$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)

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 ?!

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
Avatar
Olivier Miakinen
Le 22/03/2011 07:11, SAM a écrit :

function nltobr($string, $is_xhtml = true, $indent = "")
{
$br = $is_xhtml ? "<br />" :"<br>";
return str_replace("n", "$brn$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.



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", "$brn$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", "$brn$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.

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



;-)

[...]

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 "rn"
écrit ou lu sur le disque ou sur le réseau, mais ce n'est peut-être
pas le cas partout.

Cordialement,
--
Olivier Miakinen
1 2