/** * Appliquer des filtres sur un squelette complet * * La fonction accèpte plusieurs tableaux de filtres à partir du 3ème argument * qui seront appliqués dans l'ordre * * @uses echapper_php_callback() * * @param array $skel * @param string $corps * @param array $filtres * Tableau de filtres à appliquer. * @return mixed|string */ function sandbox_filtrer_squelette($skel, $corps, $filtres) { $series_filtres = func_get_args(); array_shift($series_filtres); // skel array_shift($series_filtres); // corps // proteger les <INCLUDE> et tous les morceaux de php licites if ($skel['process_ins'] == 'php') { $corps = preg_replace_callback(',<[?](\\s|php|=).*[?]>,UimsS', 'echapper_php_callback', $corps); } // recuperer les couples de remplacement $replace = echapper_php_callback(); foreach ($series_filtres as $filtres) { if (count($filtres)) { foreach ($filtres as $filtre) { if ($filtre and $f = chercher_filtre($filtre)) { $corps = $f($corps); } } } } // restaurer les echappements return str_replace($replace[0], $replace[1], $corps); }
function analyse_resultat_skel($nom, $cache, $corps, $source='') { $headers = array(); // Recupere les < ?php header('Xx: y'); ? > pour $page['headers'] // note: on essaie d'attrapper aussi certains de ces entetes codes // "a la main" dans les squelettes, mais evidemment sans exhaustivite if (preg_match_all( '/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims', $corps, $regs, PREG_SET_ORDER)){ foreach ($regs as $r) { $corps = str_replace($r[0], '', $corps); # $j = Content-Type, et pas content-TYPE. $j = join('-', array_map('ucwords', explode('-', strtolower($r[2])))); if ($j=='X-Spip-Filtre' AND isset($headers[$j])) $headers[$j].="|".$r[3]; else $headers[$j] = $r[3]; } } // S'agit-il d'un resultat constant ou contenant du code php $process_ins = ( strpos($corps,'<'.'?') === false OR strpos(str_replace('<'.'?xml', '', $corps),'<'.'?') === false ) ? 'html' : 'php'; // traiter #FILTRE{} ? if (isset($headers['X-Spip-Filtre']) AND strlen($headers['X-Spip-Filtre'])) { // proteger les <INCLUDE> et tous les morceaux de php if ($process_ins == 'php') $corps = preg_replace_callback(',<[?](\s|php|=).*[?]>,UimsS', 'echapper_php_callback', $corps); foreach (explode('|', $headers['X-Spip-Filtre']) as $filtre) { if ($f = chercher_filtre($filtre)) $corps = $f($corps); } // restaurer les echappements $corps = echapper_php_callback($corps); unset($headers['X-Spip-Filtre']); } return array('texte' => $corps, 'squelette' => $nom, 'source' => $source, 'process_ins' => $process_ins, 'invalideurs' => $cache, 'entetes' => $headers, 'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0 ); }