OVH Cloud OVH Cloud

include intelligent ?

5 réponses
Avatar
Denis Beauregard
Bonjour,

Existe-t-il un "include" intelligent, qui n'incluerait pas les <head>,
etc. quand ils sont déjà dans le fichier appelant ?

Si je fais le fichier reponses.php avec des include de reponse1.php
à reponse9.php par exemple, il y aura tout le contenu de ces fichiers.

Comme je voudrais éditer ces fichiers avec le composeur de Mozilla,
je me retrouve avec les <head> des fichiers inclus, ce qui donne
par exemple:


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body><br>

<hr size="2" width="100%">
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h2>...</h2>
texte
</body></html>

<hr size="2" width="100%">
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h2>...</h2>
texte
</body></html>

<hr size="2" width="100%">
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h2>...</h2>
texte
</body></html>

texte
</body></html>


Une telle page est lisible sans problème avec un navigateur récent.
Mais avec un navigateur le moindrement ancien, on se retrouvera avec
une page qui finit avec le premier </html> si cela ne plante pas
auparavant.

En fouillant sur www.php.net, je vois que je pourrais faire un
file_get_contents, un remplacement de chaine puis un file_put_contents
mais je trouve cela un peu lourd pour un problème qui me semble assez
commun...


Denis

5 réponses

Avatar
Olivier Miakinen

Existe-t-il un "include" intelligent, qui n'incluerait pas les <head>,
etc. quand ils sont déjà dans le fichier appelant ?


Ça me semble facile. Le fichier appelé étant interprété par PHP, il te
suffir de positionner une variable booléenne dans l'appelant qui, si
elle est présente et égale à TRUE dans l'appelé, désactivera l'affichage
du <head>.

Cela étant dit, ton problème n'est pas limité à la duplication des
<head> et </head>. Tout d'abord il y a aussi duplication du DOCTYPE,
de <body> et de </body>, mais aussi il te manque le <title> obligatoire.

[...]

Comme je voudrais éditer ces fichiers avec le composeur de Mozilla,
je me retrouve avec les <head> des fichiers inclus, [...]


Ah, d'accord. En fait le problème est que tu utilises un éditeur qui
prend des fragments de code HTML pour des pages entières. Je suis quand
même surpris qu'il ne mette pas de <title>, mais passons.

Je peux te proposer une idée : tu continues d'éditer tes fichiers avec
le composeur de Mozilla, et tu les sauves dans un répertoire de travail.
Ensuite, tu passes une petite moulinette qui supprime le début de chaque
fichier qu'il trouve (début jusqu'à <body>) et sa fin (depuis </body>
jusqu'à la fin) avant de sauvegarder le résultat dans le répertoire réel
où il sera utilisé.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>


Pas de <title> ici : c'est mal

</head>
<body><br>


Beuah... c'est quoi ce <br> en debut de page ?

<hr size="2" width="100%">
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">


Voilà un second DOCTYPE.

<html>


Un autre <html>.

<head>


Encore un <head>, toujours sans <title>.

</head>
<body>


Et un autre <body>, etc. ad nauseam.

[...]

Une telle page est lisible sans problème avec un navigateur récent.


Euh... tu veux dire que tu l'as testée avec Firefox et Opera, et que
ça marchait ? Mais as-tu essayé les quelques dizaines de navigateurs
récents qui existent, dont certains ne tournent que sur Windows,
d'autres que sur Mac, et d'autres sur des Unix exotiques ?

Mais avec un navigateur le moindrement ancien, on se retrouvera avec
une page qui finit avec le premier </html> si cela ne plante pas
auparavant.


Pareil avec un navigateur le moindrement respectueux des normes, et un
peu moins tolérant que d'autres.

En fouillant sur www.php.net, je vois que je pourrais faire un
file_get_contents, un remplacement de chaine puis un file_put_contents
mais je trouve cela un peu lourd pour un problème qui me semble assez
commun...


Le faire à chaque include, c'est très lourd, oui. Mais le faire une fois
par une petite moulinette que tu ne lances que lorsqu'un fichier est
modifié, c'est bien plus propre.

Avatar
loufoque
Denis Beauregard a dit le 25/06/2005 à 10:02:

Existe-t-il un "include" intelligent, qui n'incluerait pas les <head>,
etc. quand ils sont déjà dans le fichier appelant ?


eval('?>'.preg_replace(array('/^.*<body>/Ui', '/</body>.*$/Ui'),
array('', ''), file_get_contents('fichier.php')));

Avatar
Denis Beauregard
Le 25 Jun 2005 08:43:51 GMT, Olivier Miakinen <om+
écrivait dans fr.comp.lang.php:


Existe-t-il un "include" intelligent, qui n'incluerait pas les <head>,
etc. quand ils sont déjà dans le fichier appelant ?


Ça me semble facile. Le fichier appelé étant interprété par PHP, il te
suffir de positionner une variable booléenne dans l'appelant qui, si
elle est présente et égale à TRUE dans l'appelé, désactivera l'affichage
du <head>.


Dans le problème que j'ai en ce moment, le fichier inclus est toujours
inclus. Il est en HTML pur et édité avec Composer de Mozilla.
Composer ne conserve pas les commandes PHP. Je m'en sers ici parce
que c'est plus simple pour éditer un petit texte avec les accents et
une mise en page assez simple.


Cela étant dit, ton problème n'est pas limité à la duplication des
<head> et </head>. Tout d'abord il y a aussi duplication du DOCTYPE,
de <body> et de </body>, mais aussi il te manque le <title> obligatoire.


Le title est là, ainsi que les meta. Je les avais enlevés pour ne pas
alourdir le message.

[...]

Comme je voudrais éditer ces fichiers avec le composeur de Mozilla,
je me retrouve avec les <head> des fichiers inclus, [...]


Ah, d'accord. En fait le problème est que tu utilises un éditeur qui
prend des fragments de code HTML pour des pages entières. Je suis quand
même surpris qu'il ne mette pas de <title>, mais passons.


Il met les <title>.

Je peux te proposer une idée : tu continues d'éditer tes fichiers avec
le composeur de Mozilla, et tu les sauves dans un répertoire de travail.
Ensuite, tu passes une petite moulinette qui supprime le début de chaque
fichier qu'il trouve (début jusqu'à <body>) et sa fin (depuis </body>
jusqu'à la fin) avant de sauvegarder le résultat dans le répertoire réel
où il sera utilisé.


C'est ce que j'ai fait. Pour référence, la moulinette (en DOS) est:

find /v "<!DOCTYPE" <a.htm | find /v "head>" | find /v "body>" >a.php

Le hic est qu'il faudra la changer quand le composeur changera le
contenu des en-têtes.


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>


Pas de <title> ici : c'est mal

</head>
<body><br>


Beuah... c'est quoi ce <br> en debut de page ?


Je n'ai pas fait le nettoyage de tous les fichiers. À vrai dire,
j'ai fait un unique fichier avec toutes les réponses possibles,
puis j'ai fait un fichier par réponse. Par la suite, il y a un
fichier avec toutes les réponses (donc plusieurs include) et un
fichier avec une seule réponse, selon l'argument.

[...]
Et un autre <body>, etc. ad nauseam.


C'est justement le problème ! Les fichiers sont inclus au complet...

[...]

Une telle page est lisible sans problème avec un navigateur récent.


Euh... tu veux dire que tu l'as testée avec Firefox et Opera, et que
ça marchait ? Mais as-tu essayé les quelques dizaines de navigateurs
récents qui existent, dont certains ne tournent que sur Windows,
d'autres que sur Mac, et d'autres sur des Unix exotiques ?


J'ai essayé avec Mozilla 1.7. Par contre, je sais que NN 4.75
plantait si une page n'avait pas de </body>. Il me semble que IE
plante s'il n'y a pas de <body> ou quelque chose comme cela. En
conséquence, je me dis que les <body>, <head> etc. en double ou
triple nuisent à certains navigateurs.

Si le PHP qui est tellement répandu aujourd'hui ne filtre pas ces
problèmes potentiels, je me disais que les navigateurs récents en
tiennent compte, mais il semble que je me sois trompé.

Mais avec un navigateur le moindrement ancien, on se retrouvera avec
une page qui finit avec le premier </html> si cela ne plante pas
auparavant.


Pareil avec un navigateur le moindrement respectueux des normes, et un
peu moins tolérant que d'autres.

En fouillant sur www.php.net, je vois que je pourrais faire un
file_get_contents, un remplacement de chaine puis un file_put_contents
mais je trouve cela un peu lourd pour un problème qui me semble assez
commun...


Le faire à chaque include, c'est très lourd, oui. Mais le faire une fois
par une petite moulinette que tu ne lances que lorsqu'un fichier est
modifié, c'est bien plus propre.


J'ai fait ma petite moulinette sous forme de fichier .bat. Comme je
ne prévois pas changer souvent ces pages, c'est suffisant pour mes
besoins. Mais je suis tout de même surpris que le PHP n'est pas
prévu le coup, surtout qu'il y a maintenant un include permettant
de prendre des pages sur d'autres sites, donc en théorie, des pages
contenant toutes les en-têtes.


Denis


Avatar
Antoine
Denis Beauregard wrote:
<snip>
J'ai essayé avec Mozilla 1.7. Par contre, je sais que NN 4.75
plantait si une page n'avait pas de </body>. Il me semble que IE
plante s'il n'y a pas de <body> ou quelque chose comme cela. En
conséquence, je me dis que les <body>, <head> etc. en double ou
triple nuisent à certains navigateurs.


Oublie netscape 4.x . Ceux qui l'utilisent encore ferait bien de changer
de navigateur (aucune excuse).
Peu de chance qu'IE plante pasqu'il manque un tag, justement ce
navigateur est connu pour sa très (trop) grande tolérance.

Si le PHP qui est tellement répandu aujourd'hui ne filtre pas ces
problèmes potentiels, je me disais que les navigateurs récents en
tiennent compte, mais il semble que je me sois trompé.


Au lieu d'utiliser un .bat en moulinette, tu peux probablement crééer ta
propre fonction d'include. Un truc du genre:

- lire le fichier demandé
- récupérer le contenu de la balise <body> avec preg_match (sans oublier
l'option /m/ pour des lignes multiples.

Ensuite dans reponses.php :
for(i = 1; i<11; i++;) {
echo '<!-- Inclusion du fichier de réponse #'.$i.' -->';
echo monInclude('reponse'.$i.'.php');
}


Enfin vu que tes pages changent peu, continue avec ta moulinette ;o)

cheers,

--
Antoine
http://fr.wikipedia.org/
Outlook Express ? Lisez au moins: http://usenetfr.free.fr/faqoe.htm

Avatar
Olivier Miakinen

[ <title> absent ]


Le title est là, ainsi que les meta. Je les avais enlevés pour ne pas
alourdir le message.


Ok. C'était une intention louable de ta part, pardon de ne pas y avoir
pensé.

Je peux te proposer une idée : tu continues d'éditer tes fichiers avec
le composeur de Mozilla, et tu les sauves dans un répertoire de travail.
Ensuite, tu passes une petite moulinette qui supprime le début de chaque
fichier qu'il trouve (début jusqu'à <body>) et sa fin (depuis </body>
jusqu'à la fin) avant de sauvegarder le résultat dans le répertoire réel
où il sera utilisé.


C'est ce que j'ai fait. Pour référence, la moulinette (en DOS) est:

find /v "<!DOCTYPE" <a.htm | find /v "head>" | find /v "body>" >a.php

Le hic est qu'il faudra la changer quand le composeur changera le
contenu des en-têtes.


Eh bien soit tu fais une moulinette avec un outil plus puissant que
le find de DOS (par exemple awk si tu utilises Cygwin), soit tu la
programmes toi-même, par exemple en PHP.

Euh... tu veux dire que tu l'as testée avec Firefox et Opera, et que
ça marchait ? Mais as-tu essayé les quelques dizaines de navigateurs
récents qui existent, dont certains ne tournent que sur Windows,
d'autres que sur Mac, et d'autres sur des Unix exotiques ?


J'ai essayé avec Mozilla 1.7. Par contre, je sais que NN 4.75
plantait si une page n'avait pas de </body>. Il me semble que IE
plante s'il n'y a pas de <body> ou quelque chose comme cela. En
conséquence, je me dis que les <body>, <head> etc. en double ou
triple nuisent à certains navigateurs.


En fait, le premier navigateur à tester est <http://validator.w3.org/>.
Si ce premier test est concluant, et qu'en plus cela s'affiche bien sur
deux navigateurs modernes différents, alors c'est déjà une bonne chose.
Tu peux ensuite chercher la compatibilité avec des vieux machins comme
NN4 ou IE5 (si j'étais méchant je mettrais IE6 avec) mais ce n'est pas
forcément indispensable.

Note que les <head> multiples ne passeront pas le premier test.

Si le PHP qui est tellement répandu aujourd'hui ne filtre pas ces
problèmes potentiels, je me disais que les navigateurs récents en
tiennent compte, mais il semble que je me sois trompé.


Bof... je ne vois pas pourquoi PHP aurait prévu dans ses fonctions de
base de contourner un problème que tu t'es créé tout seul. D'autant plus
que ce problème provient de l'utilisation d'un outil qui (tu le dis
toi-même) ne conserve pas les instructions PHP.

[...] Mais je suis tout de même surpris que le PHP n'[ait] pas
prévu le coup, surtout qu'il y a maintenant un include permettant
de prendre des pages sur d'autres sites, donc en théorie, des pages
contenant toutes les en-têtes.


<mode amusé>
Hum... tu veux dire que PHP devrait encourager le vol de contenu ?
Parce que prendre le contenu d'une page ailleurs, en supprimant les
informations de copyright qui peuvent se trouver dans les entêtes,
pour l'inclure dans sa propre page avec ses propres entêtes, ça y
ressemble étrangement.
</>

Bon, je me doute bien que ce n'est pas ce à quoi tu pensais, mais prends
quand même le temps d'y réfléchir. ;-)


Cordialement,
--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.