Depuis PHP 5.3, la fonction split est devenue obsolète (voir le manuel PHP).

Il convient donc de la remplacer par preg_split, son équivalente plus moderne qui utilise l'extension PCRE.

J'ai donc développé un bout de code qui va permettre de remplacer les appels split par preg_split.

Voici le script : (il affiche sur la sortie standard le fichier converti)


<?php

/****************************************************************************/
/************************ split2preg_split **********************************/
/************************ author : gbretou **********************************/
/****************************************************************************/


$file       = $_SERVER['argv'][1];
$lines      = file($file);
foreach ($lines as $line)
{
        if (preg_match('|(.*)(?<![a-zA-Z0-9-_])(split\(([\'\"\$]{1}(.*)[\'\"]?),(.*)$)|', $line, $matches))
        {
                $pattern = $matches[3];
                $pattern = recalculateRegex($pattern);
                echo $matches[1] . "preg_split(" . $pattern . "," . $matches[5] . " ";
        }
        else
        {
                echo $line;
        }
}

/**
 * Recalculates the regex
 * 2 cases :
 *  - case 1 : a PHP variable is provided for the pattern
 *  - case 2 : a simple string is provided
 */
function recalculateRegex($pattern)
{

        $delimiter = '/';
    if (substr($pattern, 0, 1) == '$')
    {
            return sprintf("'%s' . str_replace('%s', '\%s', %s) . '%s'",
            $delimiter,
            $delimiter,
            $delimiter,
                    $pattern,
            $delimiter
            );
    }
    else
    {
            return sprintf("%s%s%s%s%s",
                    substr($pattern, 0, 1),
                    $delimiter,
                    str_replace($delimiter, "\$delimiter", substr($pattern, 1, -1)),
                    $delimiter,
                    substr($pattern, 0, 1)
            );
    }

}

?>


Pour le lancer sur un fichier PHP, vous pouvez faire :

php split_modifier.php [FICHIER]

ou si vous souhaitez le lancer sur tous les fichiers PHP d'un répertoire :

find . -name '*.php' | xargs php split_modifier.php

Ce programme présente plusieurs limites :

 - si votre split est sur plusieurs lignes, il ne sera pas pris en compte car l'expression régulière ne sera pas matchée

 - le fait d'ajouter un délimiteur ne permet pas de convertir toutes les expressions POSIX en PCRE (exemple)

 - il affiche le résultat sur la sortie standard et ne fait pas de remplacement directement dans le fichier

En fonction des retours que j'aurais, je modifierais le script.

Néanmoins, pour le deuxième point, je vous propose de créer vos propres tests puis de comparer si le retour du fichier avec split est identique que celui avec preg_split. Voici déjà quelques lignes : 


<?php

$delimiter = "/";
var_dump(split('/', "test / test"));
var_dump(split('\|', "test / test")); //this is a comment
var_dump(split('\|', "test | test"));
var_dump(split('/ ', "test / test")); //this is a comment
var_dump(split('[/.-]', '31-12-2010'));
var_dump(split('[/.-]', '31/12/2010'));
var_dump(split("[ \t ]+", "Please cut   \t me in pieces"));
var_dump(split('\|/', 'test /test |/ test / test'));
var_dump(split($delimiter, 'test / test / test / test'));
var_dump(preg_split('|t/t|', 'this another test')); //must not be changed
var_dump(my_split('/', 'this / is / another / test'));

function my_split($pattern, $value) //must not be changed!
{
    return split($pattern, $value);
}

?>


Pour faire une comparaison, je vous propose de suivre le cheminement suivant :

 - mettez vos tests avec split dans le fichier split_test.php

 - remplacez vos split par preg_split dans un fichier preg_split_test.php

 - lancez les deux fichiers puis comparez leur retour via un diff.

(MAJ le 18/02 pour gestion des fonctions)