Supprimer les caractères parasites

© Christian PAULUS. Document créé le 17 juin 2011 , mis à jour le 9 septembre 2011.

L'idéal quand on veut être admiré, c'est d'être mort. Michel Audiard

Accueil du site > Astuces > PHP > Supprimer les caractères parasites

Optimisation / PHP 5

Un bug souvent pénible à découvrir : la page blanche ou mal construite suite à un header HTTP envahissant.

Dans ce cas, le journal des erreurs PHP (php_error.log) précise :

PHP Warning : Cannot modify header information - headers already sent in /usr/local/www/..... nom du fichier php

L’en-tête HTTP a déjà été envoyé. Et un autre script tente de renouveller l’opération, soit par la fonction header(), soit parceque un fichier PHP importé (via include() ou autre) commence ou se termine par espace ou autre caractère parasite. PHP tente d’envoyer ce caractère sur la sortie HTTP, et génère l’erreur illustrée plus haut.

Si commencer son script à la première ligne résout ce problème, découvrir le caractère parasite en fin de script, après la balise de fermeture, n’est pas toujours évident.

Le plus simple est de ne pas terminer ses scripts par la balise de fermeture PHP  ?>. Sauf si bien sûr le fichier PHP contient un vrai contenu HTML. En gros, si c’est un script qui ne contient que des fonctions, vous pouvez oublier cette balise de fermeture PHP.

Un script pour nettoyer le fichier PHP

Voici un petit script - à utiliser en ligne de commande - qui

  • scrute le dossier donné en paramètre
  • ou le fichier
  • si c’est un dossier, il traite les fichiers disponibles dans ce dossier
  • vérifie qu’il s’agit d’un fichier PHP
  • le charge en mémoire si c’est le cas
  • supprime les espaces en trop via la fonction PHP trim()
  • affiche le résultat par le mot correct, ou précise le nombre de caractères en trop.

L’option -t permet d’enregistrer le résultat dans le fichier incriminé. Une copie de sauvegarde de l’ancien fichier reste disponible. Son nom de fichier se termine par le tilde ˜.

Vous pouvez désactiver cette fonctionnalité (la sauvegarde), à vos risques et périls.

Dans tous les cas, faites une copie de sauvegarde de vos données avant utilisation.

Ce script a été testé sur MacOS. Il n’a pas été testé sous Windows.

#!/usr/bin/php
<?php

/**
* trim_script: Supprime les espaces superflus
* d'un script PHP.
*
* Licence GPL
*
* Christian Paulus <cpaulus at quesaco.org>
* (c) 2011
* http://www.quesaco.org/php-supprimer-caracteres-parasites
*
* version: Fri Jun 17 11:13:15 CEST 2011
*
*/

/**
* Usage :
*
* trim_script.php [-h] [-q] [-t] [-v] file [file ...]
*
* La commande scrute les fichiers ou dossiers
* donnés en paramètre, charge les scripts PHP
* rencontrés et contrôle le début et la fin du script
* en vérifiant s'il n'y a pas d'espace (et
* retour chariot) en trop.
*
* Les fichiers douteux sont signalés.
*
* Affiche la liste des fichiers PHP en précisant
* soit correct : pas d'espace en trop
* soit le nombre d'espaces à supprimer
*
* -t Active la suppression des derniers espaces
*    du fichier. Cette option écrase le fichier PHP
*    par la version corrigée.
*
*/

$trim = $help = FALSE;
$backup = $verbose = TRUE;
$files = array();
$command = basename($argv[0]);
$usage = "Usage: {$command} [-h] [-b] [-n] [-q] [-t] [-v] file [file ...]";

if ($argc > 1) {
        // Le premier arg est le nom de ce script
       
        // Ergo, passer à l'argument suivant
        while ($arg = next($argv))
        {
                if ($arg[0] === '-')
                {
                        // option commence par '-'
                        switch ($arg) {
                                case '-h':
                                case '--help':
                                case '-help':
                                case '-?':
                                        $help = TRUE;
                                        break;
                                case '-b':
                                        /**
                                         * L'option -b permet de conserver
                                         * une copie de sauvegarde du fichier
                                         * corrigé. Le nom du fichier
                                         * porte l'extension ~.php
                                         * (tilde point php)
                                         */
                                        $backup = TRUE;
                                        break;
                                case '-n':
                                        /**
                                         * L'option -n annule la copie
                                         * de sauvegarde du fichier modifié.
                                         */
                                        $backup = FALSE;
                                        break;
                                case '-q':
                                        $verbose = FALSE;
                                        break;
                                case '-t':
                                        $trim = TRUE;
                                        break;
                                case '-v':
                                        $verbose = TRUE;
                                        break;
                        }
                }
                else {
                        $files[] = $arg;
                }
        }
}
else {
        fwrite(STDERR, $usage . PHP_EOL);
        exit(1);
}


if ($help) {
        fwrite(STDOUT, "

{$command} -- display PHP files

{$usage}

Options:
        -h  This option prints a usage summary and exits.
        -b  This option backup file before write modification (default).
        -n  This option disable backup.
        -q  With this option, no warnings or errors are printed.
        -t  This option trim PHP file.
        -v  This option turns on verbose mode (default).
       
        file        PHP filename or directory to analyze

");
        exit();
}

function my_log ($text)
{
        fwrite(STDOUT, $text . PHP_EOL);
        return (TRUE);
}

function traiter_fichier_php ($file)
{
        global  $backup, $trim, $verbose;
        $done = '';
       
        if (
                (strlen ($file) > 4)
                && (substr ($file, -4, 4) == '.php')
        )
        {
                $contents = file_get_contents ($file);
                $before = strlen ( $contents);
                $contents = trim ($contents);
                $after = strlen ( $contents);
               
                if ($trim
                        && is_writable (dirname ( $file))
                )
                {
                        $done = '';
                       
                        /**
                         * Copie de sauvegarde si souhaité
                         */
                        if ($backup)
                        {
                                $rename = substr ($file, 0, strlen ($file) - 4)
                                        . '~'
                                        . '.php'
                                        ;
                                rename ($file, $rename);
                        }
                       
                        /**
                         * Corriger le fichier si souhaité
                         */
                        if (file_put_contents ($file, $contents))
                        {
                                $done = ' DONE!';
                        }
                }
               
                if ($verbose)
                {
                        $msg =
                                ($before > $after)
                                ? ' has '.($before - $after).' chars to trim.'.$done
                                : ' is correct.'
                                ;
                        my_log ($file.$msg);
                }
                return (TRUE);
        }
        return (FALSE);
}

function traiter_dossier ($dir)
{
        if ($dh = opendir($dir))
        {
       while (($file = readdir($dh)) !== FALSE)
                {
                        if (        ($file == '.')
                                ||        ($file == '..')
                        ) {
                                continue;
                        }
                       
                        $path = $dir . '/' . $file;

                        if (is_file ($path))
                        {
                                traiter_fichier_php ($path);
                        }
                        else if (is_dir ($path))
                        {
                                traiter_dossier ($path);
                        }
                }
                closedir($dh);
               
                return (TRUE);
        }
        return (FALSE);
}


/**
* traiter les fichiers donnés en paramètre
*/
foreach ($files as $file)
{
        if (is_readable($file))
        {
       if (is_file($file))
                {
                        traiter_fichier_php ($file);
                }
                else if (is_dir ($file))
                {
                        traiter_dossier ($file);
                }
   }
   else if ($verbose)
        {
       fwrite(STDERR, 'Error: '.$file . ' unreadable' . PHP_EOL);
   }
}

Problème de copier/coller ? Voici le script à télécharger :

Zip - 1.8 ko

Plussoyez !

Les forums sont fermés.