Code PHP colorisé conforme XHTML strict

© Christian PAULUS. Document créé le 27 février 2008 , mis à jour le 28 février 2008.

Aucune route n'est longue à côté d'un ami. Proverbe japonais

Accueil du site > Astuces > SPIP > Code PHP colorisé conforme XHTML strict

Colorisation syntaxique / SPIP 1.9.2d

La fonction PHP highlight_string() renvoie une version colorisée d’un script PHP, bien agréable pour un site comme Quesaco qui propose parfois quelques extraits de codes.

Malheureusement, en PHP 4, le résultat est loin d’être conforme XHTML strict.

Voici un bout de code à ajouter dans le fichier mes_options.php.

Ensuite, dans la boite d’édition, il suffit de placer un code PHP d’exemple, en le faisant commencer par < ?php et terminer par  ?>.

N’enveloppez pas votre extrait de code par la balise <code></code>.

Ce code déclare la fonction apres_propre() qui est automatiquement prise en charge par SPIP.

Uniquement activé pour PHP version < 5, ce code cherche dans le texte en cours une portion de code PHP et remplace toutes les occurences de « <font color="# ??????"></font> » en « <span style="color :# ??????"></span> ».

<?php
    
    
if(version_compare(PHP_VERSION"5""<")) {
        
        function 
apres_propre($texte) {
    
            
$debut_base64 "<p class=\"spip\"><span "
             
"class=\"base64\" title='";
            
$fin_base64 "' ></span></p>";
            
            if(
preg_match(','.$debut_base64.','$texte)) {
                if(!
function_exists('_xhtml_strict')) {
                function 
_xhtml_strict($matches) {

                    
$debut_code_php ",^<"."code>"
                        
"<font color=\"#000000\">\n"
                        
"<font color=\"#[[:digit:]ABCDEF]{6}\">&lt;[?]php,";
                    
$fin_code_php ",[?]&gt;</font>\n</font>\n</"."code>$,";

                    
$result base64_decode($matches[2]);

                    if(
strlen($result
                        && 
preg_match(
                            
// est-ce bien du code PHP ?
                            
$debut_code_php
                            
$result)
                        && 
preg_match(
                            
$fin_code_php
                            
$result)
                        ) {
                        
                        
$result preg_replace(
                            array(
                                  
',^(<'.'code'.'>),'
                                
',(</'.'code'.'>)$,'
                                
',^(<font color=\"#000000\">\n),'
                                
',(</font>)$,'
                                
',(<font color=\"#)'
                                    
.'([[:digit:]ABCDEF]{6})(\">)(.*)(</font>),UisS'
                            
)
                            , array(
'','','',''
                                
'<span style=\'color:#${2}\'>${4}</span>'
                            
)
                            , 
$result
                        
);
                        
// envelopper le paquet
                        
$result "<"."code class='code_php'>"
                            
"$result</code>";
                        
$result base64_encode($result);

                    } else {
                        
$result $matches[2];
                    }
                    return(
$matches[1].$result.$matches[3]);
                }
                } 
// end !function_exists()

                // cherche le paragraphe en base64
                
$texte preg_replace_callback(
                    
',('.$debut_base64.')(.*)('.$fin_base64.'),'
                    
"_xhtml_strict"
                    
$texte);
                
                return(
$texte);
            }
            return(
$texte);
        }
        
        
/**/
    
}
?>

A tout hasard, le fichier compressé (ne pas remplacer votre fichier mes_options.php s’il existe, mais rajoutez le code) :

Zip - 908 octets

Plussoyez !

Les forums sont fermés.

  • Code PHP colorisé conforme XHTML strict 28 février 2008 19:26, par Paladin

    La version postée ce matin comportait une erreur dans le masque.

    font color=\"#[07B]{6}\"

    était incorrect. Remplacé maintenant par

    font color=\"#[[:digit:]ABCDEF]{6}\"

    Les forums sont fermés.