Vérifier si un doctype existe déjà sur la page

Le problème exposé dans ce sujet a été résolu.

Bonjour,

sur ma page, quand j'ai une erreur, j'inclue une page d'erreur. Mais certaine page possède déjà le "Doctype html", alors que d'autre non. Je voulais savoir si ça posais problème qu'il se mette à double ou non. Le cas échéant, le supprimer ou le détecter si possible.

En vous remerciant, WinXaito.

+0 -0

N'ayant pas bien compris ton besoin, je vais tenter de répondre à la question "brute" :

gageons que le contenu de ta page est contenu dans la variable $contenu_page

1
2
3
4
5
6
7
<?php
if($contenu_page == '' || str_pos('DOCTYPE html', $contenu_page) === false){
    $contenu_page = "<! DOCTYPE html >". (empty($contenu_page)?'':$contenu_page);
}
/* et à la fin */

echo $contenu_page;//affiche la page entière
+0 -0

Bonjour, je ne sais pas si c'est bien ce que j'attend. Je vais essayer de détailler un peu plus:

index.php:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width; initial-scale=1.0;">
    </head>
    <body>
        <?php 
            require_once("error.php");
        ?>
    </body>
</html>

Un autre fichier php:

1
<?php require_once("error.php");?>

Et enfin le fichier error.php:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width; initial-scale=1.0;">
    </head>
    <body>
        <p>ERROR</p>
    </body>
</html>

Comme on peu le voir, avec index.php, le toute l'en-tête et le body sont ajouté à nouveau.

Pour répondre à ta question normalement le navigateur s'arrête au premier Doctype, et si c'est le même qui est en double tu ne risques rien. Il s'agit donc juste d'une question de goût du développeur pour qualifier ceci de "propre" ou "pas propre".

Pour la solution d'artragis, c'est assez contraignent d'utiliser une variable. Il faudrait plutôt voir avec la temporisation de sortie, regarde ob_start().

EDIT : Tu as posté ta réponse pendant que j'écrivais la mienne. Ce n'est pas très stable de déclarer deux fois les éléments (html, body, head…).

+0 -0

J'ai mis un lien vers la doc de la temporisation de sortie.

La réponse est envoyé uniquement quand ob_end_flush() est appelé après ob_start(). Tu peux même appeler plusieurs fois la fonction pour hiérarchisé le traitement.

Il y a aussi la possibilité de "streaming" de ta réponse, c'est-à-dire envoyer une petite partie de ton code avec ob_flush(), sans attendre d'envoyer toute la page (tu peux tester avec sleep).

La doc explique très bien la temporisation.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte