Il vous est peut-être déjà arrivé de tomber sur ce message d’avertissement dans un vieux script PHP :
Function eregi() is deprecated.
Ou, sur une version plus récente de PHP, sur une erreur fatale encore moins sympathique :
Fatal error: Uncaught Error: Call to undefined function eregi()Code language: JavaScript (javascript)
Dans les deux cas, le problème vient du même endroit : les anciennes fonctions POSIX regex de PHP, comme ereg(), eregi(), ereg_replace(), eregi_replace(), split() et spliti(), ne doivent plus être utilisées.
Elles ont été dépréciées à partir de PHP 5.3, puis retirées de PHP 7. Le RFC PHP consacré au retrait des fonctionnalités obsolètes indique que l’extension ereg était dépréciée depuis PHP 5.3 et que l’extension PCRE devait être utilisée à la place. Voir le RFC PHP sur la suppression des fonctions obsolètes en PHP 7.
La solution consiste donc à remplacer ces anciennes fonctions par la famille preg_*, principalement preg_match(), preg_replace() et preg_split().
Pourquoi eregi() ne fonctionne plus ?
eregi() servait à faire une recherche par expression régulière sans tenir compte de la casse. Elle était basée sur l’ancien moteur POSIX regex de PHP.
Exemple historique :
$is_image = eregi( 'jpg|gif', $file_type );Code language: PHP (php)
Le problème, c’est que cette famille de fonctions est obsolète depuis longtemps. Sur PHP 5.3 à 5.6, elle générait des avertissements de dépréciation. Depuis PHP 7, elle n’existe plus. Sur PHP 8.x, un appel à eregi() provoque donc une erreur fatale.
En clair : si votre code contient encore eregi(), il appartient à une autre époque. Une époque sympathique, certes, mais une autre époque quand même.
Par quoi remplacer eregi() ?
Le remplacement direct de eregi() est preg_match() avec le modificateur i, qui rend la recherche insensible à la casse.
Ancien code :
$is_image = eregi( 'jpg|gif', $file_type );Code language: PHP (php)
Nouveau code :
$is_image = preg_match( '~jpg|gif~i', $file_type );Code language: PHP (php)
Le manuel PHP montre justement l’usage du modificateur i dans preg_match() pour effectuer une recherche insensible à la casse. Voir la documentation PHP de preg_match().
Le délimiteur ici est ~, mais vous pouvez aussi utiliser /, # ou un autre caractère supporté. L’important est de bien encadrer le motif avec un délimiteur, puis d’ajouter les modificateurs après le délimiteur final.
Attention : convertir le motif ne suffit pas toujours
Les expressions régulières POSIX utilisées par ereg() et les expressions PCRE utilisées par preg_match() se ressemblent, mais elles ne sont pas identiques.
Dans les cas simples, la conversion est facile. Dans les cas complexes, il faut relire le motif, tester les captures, vérifier les échappements et contrôler le comportement sur des entrées réelles.
Par exemple, ce remplacement est trop approximatif si l’on veut détecter une vraie extension d’image :
$is_image = preg_match( '~jpg|gif~i', $file_type );Code language: PHP (php)
Ce motif matche aussi une chaîne comme not-a-gif-but-text. Pour vérifier une extension, mieux vaut être plus précis :
$is_image = (bool) preg_match( '~\.(?:jpe?g|gif|png|webp)$~i', $filename );Code language: PHP (php)
Ici, le motif vérifie une extension en fin de nom de fichier, accepte .jpg, .jpeg, .gif, .png et .webp, puis ignore la casse avec i.
Exemple moderne : vérifier une extension d’image
Voici une fonction PHP moderne, compatible PHP 8.3+, pour vérifier une extension d’image sans utiliser eregi().
<?php
declare(strict_types=1);
/**
* Check whether a filename uses an allowed image extension.
*
* @param string $filename Filename or path to inspect.
* @return bool True when the filename has an allowed image extension.
*/
function sky_is_supported_image_filename( string $filename ): bool {
return 1 === preg_match( '~\.(?:jpe?g|gif|png|webp|avif)$~i', $filename );
}Code language: HTML, XML (xml)
Utilisation :
$filename = 'photo.JPG';
if ( sky_is_supported_image_filename( $filename ) ) {
echo 'Image valide';
}Code language: PHP (php)
Pour du WordPress, on pourrait ensuite adapter la sortie avec esc_html(), mais la logique de détection reste identique.
Tableau de remplacement des anciennes fonctions
Voici les remplacements les plus courants :
| Ancienne fonction | Remplacement moderne | Remarque |
|---|---|---|
ereg() | preg_match() | Recherche sensible à la casse |
eregi() | preg_match() avec i | Recherche insensible à la casse |
ereg_replace() | preg_replace() | Remplacement par expression régulière |
eregi_replace() | preg_replace() avec i | Remplacement insensible à la casse |
split() | preg_split() ou explode() | explode() suffit si le séparateur est fixe |
spliti() | preg_split() avec i | Découpe insensible à la casse |
sql_regcase() | À réécrire | Souvent inutile avec i |
Le RFC PHP indique aussi que PCRE offre un meilleur support Unicode et davantage de fonctionnalités que l’ancienne extension ereg. Voir le RFC PHP.
Remplacer ereg() par preg_match()
Ancien code avec ereg() :
if ( ereg( '^[0-9]+$', $value ) ) {
echo 'Nombre valide';
}Code language: PHP (php)
Nouveau code avec preg_match() :
if ( 1 === preg_match( '~^[0-9]+$~', $value ) ) {
echo 'Nombre valide';
}Code language: PHP (php)
J’aime comparer explicitement le retour à 1, car preg_match() retourne 1 si le motif correspond, 0 s’il ne correspond pas, et false en cas d’erreur. Cette distinction est utile dans du code robuste.
Remplacer eregi() par preg_match() avec le modificateur i
Ancien code avec eregi() :
if ( eregi( 'firefox', $user_agent ) ) {
echo 'Firefox détecté';
}Code language: PHP (php)
Nouveau code avec preg_match() :
if ( 1 === preg_match( '~firefox~i', $user_agent ) ) {
echo 'Firefox détecté';
}Code language: PHP (php)
Le i placé après le délimiteur final rend la recherche insensible à la casse.
Remplacer ereg_replace() par preg_replace()
Ancien code :
$clean = ereg_replace( '[^a-zA-Z0-9_-]', '', $slug );Code language: PHP (php)
Nouveau code :
$clean = preg_replace( '~[^a-zA-Z0-9_-]~', '', $slug );Code language: PHP (php)
Comme preg_replace() peut retourner null en cas d’erreur, vous pouvez sécuriser le résultat :
$clean = preg_replace( '~[^a-zA-Z0-9_-]~', '', $slug );
if ( null === $clean ) {
$clean = '';
}Code language: PHP (php)
Remplacer split() par preg_split() ou explode()
split() utilisait une expression régulière POSIX. Il faut le remplacer par preg_split() si vous avez besoin d’une expression régulière.
Ancien code :
$parts = split( '[,;]', $value );Code language: PHP (php)
Nouveau code :
$parts = preg_split( '~[,;]~', $value );
if ( false === $parts ) {
$parts = array();
}Code language: PHP (php)
Mais si vous découpez simplement une chaîne avec un séparateur fixe, explode() est plus simple et plus rapide :
$parts = explode( ',', $value );Code language: PHP (php)
Bien choisir le délimiteur PCRE
Avec les fonctions preg_*, le motif doit être encadré par des délimiteurs.
Exemples valides :
preg_match( '/jpg|gif/i', $file_type );
preg_match( '~jpg|gif~i', $file_type );
preg_match( '#jpg|gif#i', $file_type );Code language: PHP (php)
Si le motif contient beaucoup de slashs, comme une URL ou un chemin, ~ ou # évite d’échapper chaque /.
Exemple plus lisible avec ~ :
preg_match( '~^https?://~i', $url );Code language: PHP (php)
Échapper une chaîne dynamique dans une regex
Si vous insérez une variable dans une expression régulière, utilisez preg_quote(). Sinon, un caractère spécial dans la variable peut casser le motif ou modifier son sens.
Mauvaise idée :
$needle = 'file.name';
preg_match( "~$needle~i", $haystack );Code language: PHP (php)
Ici, le point dans file.name signifie “n’importe quel caractère”. Ce n’est probablement pas ce que vous voulez.
Bonne approche :
$needle = 'file.name';
$pattern = '~' . preg_quote( $needle, '~' ) . '~i';
preg_match( $pattern, $haystack );Code language: PHP (php)
Ce réflexe évite pas mal de bugs subtils. Les regex sont déjà assez sportives sans leur laisser des chausse-trappes gratuites.
Cas WordPress : ne pas utiliser une regex si WordPress a déjà une fonction
Dans WordPress, évitez de réinventer la validation quand une fonction existe déjà.
Pour vérifier un email, utilisez :
is_email( $email );Code language: PHP (php)
Pour nettoyer une clé :
$key = sanitize_key( $key );Code language: PHP (php)
Pour nettoyer un slug :
$slug = sanitize_title( $title );Code language: PHP (php)
Pour obtenir le type MIME d’un fichier uploadé, regardez plutôt du côté des fonctions WordPress dédiées comme wp_check_filetype() ou wp_check_filetype_and_ext(), selon le contexte.
Une regex est utile quand elle exprime vraiment une règle métier. Elle devient pénible quand elle remplace une API robuste déjà disponible.
Exemple WordPress moderne : vérifier un type de fichier
Pour vérifier une extension d’image dans WordPress, on peut utiliser wp_check_filetype() plutôt qu’une regex artisanale.
<?php
/**
* Check whether a filename is a supported image according to WordPress MIME handling.
*
* @param string $filename File name or path.
* @return bool True when the file extension maps to an image MIME type.
*/
function sky_is_supported_wp_image_file( string $filename ): bool {
$filetype = wp_check_filetype( $filename );
if ( empty( $filetype['type'] ) ) {
return false;
}
return str_starts_with( $filetype['type'], 'image/' );
}Code language: HTML, XML (xml)
Cette approche colle mieux à WordPress, respecte sa gestion des types autorisés et évite une regex trop simpliste.
Détecter les anciennes fonctions dans un projet
Pour trouver les anciens appels dans un projet PHP :
grep -RInE '\b(ereg|eregi|ereg_replace|eregi_replace|split|spliti|sql_regcase)\s*\(' .Code language: JavaScript (javascript)
Avec ripgrep, plus rapide et plus agréable :
rg '\b(ereg|eregi|ereg_replace|eregi_replace|split|spliti|sql_regcase)\s*\('Code language: JavaScript (javascript)
Ensuite, traitez les occurrences une par une. Les remplacements automatiques globaux sont tentants, mais les différences entre POSIX regex et PCRE peuvent produire des effets de bord.
Tester les remplacements
Après migration, testez les cas attendus et les cas limites.
Exemple rapide en PHP pur :
<?php
declare(strict_types=1);
$tests = array(
'photo.jpg' => true,
'photo.JPG' => true,
'photo.jpeg' => true,
'photo.gif' => true,
'photo.webp' => true,
'photo.txt' => false,
'photo.jpg.php' => false,
);
foreach ( $tests as $filename => $expected ) {
$result = 1 === preg_match( '~\.(?:jpe?g|gif|png|webp|avif)$~i', $filename );
if ( $result !== $expected ) {
printf(
"Test failed for %s: expected %s, got %s\n",
$filename,
$expected ? 'true' : 'false',
$result ? 'true' : 'false'
);
}
}Code language: HTML, XML (xml)
Ce petit test évite de remplacer une erreur visible par un bug discret. Et les bugs discrets sont les pires : ils ont une excellente stratégie de camouflage.
Liste des fonctions dépréciées à l’époque de PHP 5.3
PHP 5.3 avait marqué un tournant en dépréciant beaucoup de vieilles fonctions. Parmi celles que l’on rencontrait souvent dans les anciens scripts :
call_user_method(): utilisercall_user_func();call_user_method_array(): utilisercall_user_func_array();ereg(): utiliserpreg_match();eregi(): utiliserpreg_match()aveci;ereg_replace(): utiliserpreg_replace();eregi_replace(): utiliserpreg_replace()aveci;split(): utiliserpreg_split()ouexplode();spliti(): utiliserpreg_split()aveci;session_register(),session_unregister(),session_is_registered(): utiliser$_SESSION;set_socket_blocking(): utiliserstream_set_blocking();mysql_escape_string(): utiliser les APIs modernes, idéalement PDO ou MySQLi avec requêtes préparées ;mysql_db_query(): ne plus utiliser l’ancienne extensionmysql_*.
Cette liste est surtout utile pour identifier du code legacy. Sur PHP 8.x, beaucoup de ces fonctions ne sont plus seulement dépréciées : elles ont disparu.
Résumé rapide
Ancien code :
$is_image = eregi( 'jpg|gif', $file_type );Code language: PHP (php)
Nouveau code équivalent :
$is_image = preg_match( '~jpg|gif~i', $file_type );Code language: PHP (php)
Nouveau code plus précis pour une extension de fichier :
$is_image = 1 === preg_match( '~\.(?:jpe?g|gif|png|webp|avif)$~i', $filename );Code language: PHP (php)
Règle générale :
ereg()devientpreg_match();eregi()devientpreg_match()avec le modificateuri;ereg_replace()devientpreg_replace();split()devientpreg_split()ouexplode().
Conclusion
L’avertissement Function eregi() is deprecated indiquait déjà, à l’époque de PHP 5.3, que le code utilisait une fonction obsolète.
Sur PHP 7 et PHP 8, le problème devient plus sérieux : eregi() n’existe plus, et le script plante avec une erreur fatale.
La correction consiste à migrer les anciennes expressions régulières POSIX vers PCRE, avec preg_match(), preg_replace() ou preg_split() selon le cas.
Pour les cas simples, le remplacement est rapide. Pour les vieux projets, mieux vaut chercher toutes les occurrences, convertir avec méthode, puis tester les entrées réelles.
Sources utiles
- PHP RFC : suppression des fonctionnalités dépréciées en PHP 7
- PHP manual : preg_match()
- PHP manual : preg_replace()
- PHP manual : preg_split()
- PHP manual : preg_quote()
Vous souhaitez enrichir votre site avec de nouvelles fonctionnalités ? Ensemble, donnons vie à vos idées, simplement et efficacement.

Je vous conseille de plutôt remplacer
par
Pour éviter les problèmes avec les répertoires de fichiers ou URL dans votre ancien code.
Pierre
Merci pour la correction du code Pierre :)