if(ereg('[^[:space:]a-zA-Z0-9_.-]{1,}',
$HTTP_POST_FILES["submitfiles"]))
{
die ("<span class='attention'>Nom de fichier non
valide.<br><input type='button' value='Modifier'
onclick='goBack();'></span>");
}
else
{
include ("upload.php");
}
Mais ça ne fonctionne pas, je n'arrive pas à rentrer dans le if(ereg(...
:-((
Vous savez pourquoi ?
A cause du $HTTP_POST_FILES["submitfiles"] mal écrit ?
Aïe... j'ai mis ce code entre les <head></head> à la place du (pouah...) : <meta http-equiv="content-type" content="text/html; charset=utf-8">
et j'obtiens :
Internal Server Error
J'aurais dû vérifier avant d'envoyer, mais j'étais un peu en retard. En réalité c'était : header("Content-Type: text/html; charset=UTF-8");
J'avais modifié après une petite recherche sur Google...
Cela dit, comme il s'agit d'envoyer l'information dans les entêtes HTTP plutôt que dans la page HTML, cette instruction est à mettre en *tout premier*, avant que le moindre octet ait pu être transmis. Voir <http://faqfclphp.free.fr/#rub2.12>.
Je l'ai donc placé en tout premier, même avant session_start(); Mais malheureusement j'ai toujours l'erreur 500 : Internal Server Error :-(
BBEdit me le signale en UTF8 no-BOM
Ça c'est parfait.
C'est déjà ça de pris !
Je vais revenir sur ton article précédent maintenant.
Merci de consacrer du temps à ce problème.
Paul
In article <45a40e60$1@neottia.net>,
Olivier Miakinen <om+news@miakinen.net> wrote:
Aïe... j'ai mis ce code entre les <head></head> à la place du (pouah...)
:
<meta http-equiv="content-type" content="text/html; charset=utf-8">
et j'obtiens :
Internal Server Error
J'aurais dû vérifier avant d'envoyer, mais j'étais un peu en retard.
En réalité c'était :
header("Content-Type: text/html; charset=UTF-8");
J'avais modifié après une petite recherche sur Google...
Cela dit, comme il s'agit d'envoyer l'information dans les entêtes HTTP
plutôt que dans la page HTML, cette instruction est à mettre en *tout
premier*, avant que le moindre octet ait pu être transmis.
Voir <http://faqfclphp.free.fr/#rub2.12>.
Je l'ai donc placé en tout premier, même avant
session_start();
Mais malheureusement j'ai toujours l'erreur 500 : Internal Server Error
:-(
BBEdit me le signale en UTF8 no-BOM
Ça c'est parfait.
C'est déjà ça de pris !
Je vais revenir sur ton article précédent maintenant.
Aïe... j'ai mis ce code entre les <head></head> à la place du (pouah...) : <meta http-equiv="content-type" content="text/html; charset=utf-8">
et j'obtiens :
Internal Server Error
J'aurais dû vérifier avant d'envoyer, mais j'étais un peu en retard. En réalité c'était : header("Content-Type: text/html; charset=UTF-8");
J'avais modifié après une petite recherche sur Google...
Cela dit, comme il s'agit d'envoyer l'information dans les entêtes HTTP plutôt que dans la page HTML, cette instruction est à mettre en *tout premier*, avant que le moindre octet ait pu être transmis. Voir <http://faqfclphp.free.fr/#rub2.12>.
Je l'ai donc placé en tout premier, même avant session_start(); Mais malheureusement j'ai toujours l'erreur 500 : Internal Server Error :-(
BBEdit me le signale en UTF8 no-BOM
Ça c'est parfait.
C'est déjà ça de pris !
Je vais revenir sur ton article précédent maintenant.
Merci de consacrer du temps à ce problème.
Paul
paul
In article <45a4120b$, Olivier Miakinen <om+ wrote:
Veux-tu faire un essai ? Tu sépares cette instruction en deux, et tu affiches le résultat d'abord du strtolower() puis du htmlentities(), avec les noms de fichiers suivants : UnB½uf.jpg 1
Un¼uf.jpg 2
ÇaCoûteZéro¤Pièce.jpg 3
Attention : pour corser le tout, j'ai des problèmes de copier/coller des caractères accentués dans mon soft de news depuis toujours (sans que ce pb soit mettre en relation avec celui qui nous occupe...). Bref j'ai dû retaper à la main certains résultats accentués. J'espère ne rien avoir faussé !
OK les résultats :
A - strtolower() seul 1 - unb½uf.jpg 2 - un¼uf.jpg 3 - Çacoûtezéro¤pièce.jpg
(les fichiers sont correctement traités par imageMagick)
B - htmlentities() seul 1 - UnBÅ (dans base mySQL) / 2 fichiers générés dans l'arborescence : UnBÅì
In article <45a4120b$1@neottia.net>,
Olivier Miakinen <om+news@miakinen.net> wrote:
Veux-tu faire un essai ? Tu sépares cette instruction en deux, et tu
affiches le résultat d'abord du strtolower() puis du htmlentities(),
avec les noms de fichiers suivants :
UnB½uf.jpg
1
Un¼uf.jpg
2
ÇaCoûteZéro¤Pièce.jpg
3
Attention :
pour corser le tout, j'ai des problèmes de copier/coller des caractères
accentués dans mon soft de news depuis toujours (sans que ce pb soit
mettre en relation avec celui qui nous occupe...). Bref j'ai dû retaper
à la main certains résultats accentués. J'espère ne rien avoir faussé !
OK les résultats :
A - strtolower() seul
1 - unb½uf.jpg
2 - un¼uf.jpg
3 - Çacoûtezéro¤pièce.jpg
(les fichiers sont correctement traités par imageMagick)
B - htmlentities() seul
1 - UnBÅ (dans base mySQL) / 2 fichiers générés dans
l'arborescence : UnBÅì
In article <45a4120b$, Olivier Miakinen <om+ wrote:
Veux-tu faire un essai ? Tu sépares cette instruction en deux, et tu affiches le résultat d'abord du strtolower() puis du htmlentities(), avec les noms de fichiers suivants : UnB½uf.jpg 1
Un¼uf.jpg 2
ÇaCoûteZéro¤Pièce.jpg 3
Attention : pour corser le tout, j'ai des problèmes de copier/coller des caractères accentués dans mon soft de news depuis toujours (sans que ce pb soit mettre en relation avec celui qui nous occupe...). Bref j'ai dû retaper à la main certains résultats accentués. J'espère ne rien avoir faussé !
OK les résultats :
A - strtolower() seul 1 - unb½uf.jpg 2 - un¼uf.jpg 3 - Çacoûtezéro¤pièce.jpg
(les fichiers sont correctement traités par imageMagick)
B - htmlentities() seul 1 - UnBÅ (dans base mySQL) / 2 fichiers générés dans l'arborescence : UnBÅì
Olivier Miakinen
UnB½uf.jpg 1
Un¼uf.jpg 2
ÇaCoûteZéro¤Pièce.jpg 3
Ah, ton logiciel de nouvelles a du mal avec le Latin9 et a tout transformé en Latin1. Ce n'est pas grave parce que le Ç majuscule est resté, lui.
Attention : pour corser le tout, j'ai des problèmes de copier/coller des caractères accentués dans mon soft de news depuis toujours (sans que ce pb soit mettre en relation avec celui qui nous occupe...). Bref j'ai dû retaper à la main certains résultats accentués. J'espère ne rien avoir faussé !
Le test est différent de ce que je pensais, mais c'est sans importance.
OK les résultats :
A - strtolower() seul 1 - unb½uf.jpg 2 - un¼uf.jpg 3 - Çacoûtezéro¤pièce.jpg
Comme je le disais, le strlower a fonctionné sur les majuscules ASCII (non accentuées) mais pas sur le Ç.
(les fichiers sont correctement traités par imageMagick)
B - htmlentities() seul 1 - UnBÅ (dans base mySQL) / 2 fichiers générés dans l'arborescence : UnBÅì
Ah ! Finalement tu avais bien « » dans ton fichier de test. Ce caractère a pour code C5 93 en UTF-8. Lu par une fonction qui croit avoir de l'ISO-8859-1 (comme htmlentities), il s'agit d'un caractère de valeur C5, soit « Å », suivi par un caractère de valeur 93 qui n'existe pas dans ISO-8859-1 (en Windows-1252 c'est le symbole de fonction, ƒ en entités HTML). Il est donc normal que ton htmlentities ait donné un « Å », mais le « ì » je ne sais pas d'où il vient (sauf qu'un caractère invalide doit pouvoir donner à peu près n'importe quoi).
En conclusion : ton fichier est bien en UTF-8, et tu utilises bien une fonction inadaptée.
UnB½uf.jpg
1
Un¼uf.jpg
2
ÇaCoûteZéro¤Pièce.jpg
3
Ah, ton logiciel de nouvelles a du mal avec le Latin9 et a tout
transformé en Latin1. Ce n'est pas grave parce que le Ç majuscule
est resté, lui.
Attention :
pour corser le tout, j'ai des problèmes de copier/coller des caractères
accentués dans mon soft de news depuis toujours (sans que ce pb soit
mettre en relation avec celui qui nous occupe...). Bref j'ai dû retaper
à la main certains résultats accentués. J'espère ne rien avoir faussé !
Le test est différent de ce que je pensais, mais c'est sans importance.
OK les résultats :
A - strtolower() seul
1 - unb½uf.jpg
2 - un¼uf.jpg
3 - Çacoûtezéro¤pièce.jpg
Comme je le disais, le strlower a fonctionné sur les majuscules ASCII
(non accentuées) mais pas sur le Ç.
(les fichiers sont correctement traités par imageMagick)
B - htmlentities() seul
1 - UnBÅ (dans base mySQL) / 2 fichiers générés dans
l'arborescence : UnBÅì
Ah ! Finalement tu avais bien « » dans ton fichier de test. Ce
caractère a pour code C5 93 en UTF-8. Lu par une fonction qui croit
avoir de l'ISO-8859-1 (comme htmlentities), il s'agit d'un caractère de
valeur C5, soit « Å », suivi par un caractère de valeur 93 qui n'existe
pas dans ISO-8859-1 (en Windows-1252 c'est le symbole de fonction,
ƒ en entités HTML). Il est donc normal que ton htmlentities ait
donné un « Å », mais le « ì » je ne sais pas d'où il vient (sauf
qu'un caractère invalide doit pouvoir donner à peu près n'importe quoi).
En conclusion : ton fichier est bien en UTF-8, et tu utilises bien une
fonction inadaptée.
Ah, ton logiciel de nouvelles a du mal avec le Latin9 et a tout transformé en Latin1. Ce n'est pas grave parce que le Ç majuscule est resté, lui.
Attention : pour corser le tout, j'ai des problèmes de copier/coller des caractères accentués dans mon soft de news depuis toujours (sans que ce pb soit mettre en relation avec celui qui nous occupe...). Bref j'ai dû retaper à la main certains résultats accentués. J'espère ne rien avoir faussé !
Le test est différent de ce que je pensais, mais c'est sans importance.
OK les résultats :
A - strtolower() seul 1 - unb½uf.jpg 2 - un¼uf.jpg 3 - Çacoûtezéro¤pièce.jpg
Comme je le disais, le strlower a fonctionné sur les majuscules ASCII (non accentuées) mais pas sur le Ç.
(les fichiers sont correctement traités par imageMagick)
B - htmlentities() seul 1 - UnBÅ (dans base mySQL) / 2 fichiers générés dans l'arborescence : UnBÅì
Ah ! Finalement tu avais bien « » dans ton fichier de test. Ce caractère a pour code C5 93 en UTF-8. Lu par une fonction qui croit avoir de l'ISO-8859-1 (comme htmlentities), il s'agit d'un caractère de valeur C5, soit « Å », suivi par un caractère de valeur 93 qui n'existe pas dans ISO-8859-1 (en Windows-1252 c'est le symbole de fonction, ƒ en entités HTML). Il est donc normal que ton htmlentities ait donné un « Å », mais le « ì » je ne sais pas d'où il vient (sauf qu'un caractère invalide doit pouvoir donner à peu près n'importe quoi).
En conclusion : ton fichier est bien en UTF-8, et tu utilises bien une fonction inadaptée.
paul
In article <45a4a33e$, Olivier Miakinen <om+ wrote:
En conclusion : ton fichier est bien en UTF-8, et tu utilises bien une fonction inadaptée.
Argh... Il fallait s'y attendre...
Mais alors que faire ?
Quelle est la formule magique pour dire que dans une chaîne UTF8 il faut remplacer par rien les caractères autres que les alphanumériques et les accentués ?
In article <45a4a33e$1@neottia.net>,
Olivier Miakinen <om+news@miakinen.net> wrote:
En conclusion : ton fichier est bien en UTF-8, et tu utilises bien une
fonction inadaptée.
Argh... Il fallait s'y attendre...
Mais alors que faire ?
Quelle est la formule magique pour dire que dans une chaîne UTF8 il faut
remplacer par rien les caractères autres que les alphanumériques et les
accentués ?
In article <45a4a33e$, Olivier Miakinen <om+ wrote:
En conclusion : ton fichier est bien en UTF-8, et tu utilises bien une fonction inadaptée.
Argh... Il fallait s'y attendre...
Mais alors que faire ?
Quelle est la formule magique pour dire que dans une chaîne UTF8 il faut remplacer par rien les caractères autres que les alphanumériques et les accentués ?
paul
In article , paul wrote:
OK les résultats :
A - strtolower() seul 1 - unb½uf.jpg 2 - un¼uf.jpg 3 - Çacoûtezéro¤pièce.jpg
(les fichiers sont correctement traités par imageMagick)
B - htmlentities() seul 1 - UnBÅ (dans base mySQL) / 2 fichiers générés dans l'arborescence : UnBÅì
Tiens mon message a été tronqué (fausse manip ?...). Il manque le C et le D
Le C preg_replace('#&([a-z])(?:acute|grave|u ne chageait rien
Le D preg_replace("/([^a-z0-9]+)/", "." donnait a peu près ce que tu attendais
In article <paul.sellis-5970D4.01345710012007@shakotay.alphanet.ch>,
paul <paul.sellis@alussinan.org> wrote:
OK les résultats :
A - strtolower() seul
1 - unb½uf.jpg
2 - un¼uf.jpg
3 - Çacoûtezéro¤pièce.jpg
(les fichiers sont correctement traités par imageMagick)
B - htmlentities() seul
1 - UnBÅ (dans base mySQL) / 2 fichiers générés dans
l'arborescence : UnBÅì
Tiens mon message a été tronqué (fausse manip ?...).
Il manque le C et le D
Le C preg_replace('#&([a-z])(?:acute|grave|u
ne chageait rien
Le D preg_replace("/([^a-z0-9]+)/", "."
donnait a peu près ce que tu attendais
function getRewriteString($string) { /* * Première étape : on supprime les accents et cédilles des * lettres accentuées pour les ramener dans la table ASCII. * On convertit aussi les ligatures Æ, æ, ¼, ½ et ß en leurs * équivalents à deux lettres. */ $conversions = array( /* * Tous les caractères suivants sont dans Latin9 et bien sûr * dans UTF-8. Si vous êtes en Latin1, retirer les caractères * suivants : ¦¨´¸¼½¾ (dans les commentaires aussi). * Inversement, en UTF-8 vous pouvez ajouter d'autres * caractères à cette liste. */ "À"=>"A", "Á"=>"A", "Â"=>"A", "Ã"=>"A", "Ä"=>"A", "Å"=>"A", "à"=>"a", "á"=>"a", "â"=>"a", "ã"=>"a", "ä"=>"a", "å"=>"a", "Æ"=>"AE", "æ"=>"ae", "Ç"=>"C", "ç"=>"c", "È"=>"E", "É"=>"E", "Ê"=>"E", "Ë"=>"E", "è"=>"e", "é"=>"e", "ê"=>"e", "ë"=>"e", "Ì"=>"I", "Í"=>"I", "Î"=>"I", "Ï"=>"I", "ì"=>"i", "í"=>"i", "î"=>"i", "ï"=>"i", "Ñ"=>"N", "ñ"=>"n", "Ò"=>"O", "Ó"=>"O", "Ô"=>"O", "Õ"=>"O", "Ö"=>"O", "ò"=>"o", "ó"=>"o", "ô"=>"o", "õ"=>"o", "ö"=>"o", "¼"=>"OE", "½"=>"oe", "¦"=>"S", "¨"=>"s", "ß"=>"ss", "Ù"=>"U", "Ú"=>"U", "Û"=>"U", "Ü"=>"U", "ù"=>"u", "ú"=>"u", "û"=>"u", "ü"=>"u", "Ý"=>"Y", "¾"=>"Y", "ý"=>"y", "ÿ"=>"y", "´"=>"Z", "¸"=>"z" ); $string = strtr($string, $conversions);
/* * Deuxième étape : tout caractère qui n'est pas une lettre, un * chiffre, le point (.), le trait d'union (-) ou le blanc souligné * (_) est remplacé par un blanc souligné. * Attention : supprimer l'option « u » si vous n'êtes pas en * UTF-8. Si vous supprimez cette option tout en restant en UTF-8, * les caractères non ASCII seront remplacés par plusieurs « _ » * au lieu d'un seul par caractère. */ $string = preg_replace("/[^A-Za-z0-9_.-]/u", "_", $string);
return $string; }
Mais alors que faire ?
Voici une proposition, non testée.
function getRewriteString($string) {
/*
* Première étape : on supprime les accents et cédilles des
* lettres accentuées pour les ramener dans la table ASCII.
* On convertit aussi les ligatures Æ, æ, ¼, ½ et ß en leurs
* équivalents à deux lettres.
*/
$conversions = array(
/*
* Tous les caractères suivants sont dans Latin9 et bien sûr
* dans UTF-8. Si vous êtes en Latin1, retirer les caractères
* suivants : ¦¨´¸¼½¾ (dans les commentaires aussi).
* Inversement, en UTF-8 vous pouvez ajouter d'autres
* caractères à cette liste.
*/
"À"=>"A", "Á"=>"A", "Â"=>"A", "Ã"=>"A", "Ä"=>"A", "Å"=>"A",
"à"=>"a", "á"=>"a", "â"=>"a", "ã"=>"a", "ä"=>"a", "å"=>"a",
"Æ"=>"AE", "æ"=>"ae",
"Ç"=>"C", "ç"=>"c",
"È"=>"E", "É"=>"E", "Ê"=>"E", "Ë"=>"E",
"è"=>"e", "é"=>"e", "ê"=>"e", "ë"=>"e",
"Ì"=>"I", "Í"=>"I", "Î"=>"I", "Ï"=>"I",
"ì"=>"i", "í"=>"i", "î"=>"i", "ï"=>"i",
"Ñ"=>"N", "ñ"=>"n",
"Ò"=>"O", "Ó"=>"O", "Ô"=>"O", "Õ"=>"O", "Ö"=>"O",
"ò"=>"o", "ó"=>"o", "ô"=>"o", "õ"=>"o", "ö"=>"o",
"¼"=>"OE", "½"=>"oe",
"¦"=>"S", "¨"=>"s", "ß"=>"ss",
"Ù"=>"U", "Ú"=>"U", "Û"=>"U", "Ü"=>"U",
"ù"=>"u", "ú"=>"u", "û"=>"u", "ü"=>"u",
"Ý"=>"Y", "¾"=>"Y",
"ý"=>"y", "ÿ"=>"y",
"´"=>"Z", "¸"=>"z"
);
$string = strtr($string, $conversions);
/*
* Deuxième étape : tout caractère qui n'est pas une lettre, un
* chiffre, le point (.), le trait d'union (-) ou le blanc souligné
* (_) est remplacé par un blanc souligné.
* Attention : supprimer l'option « u » si vous n'êtes pas en
* UTF-8. Si vous supprimez cette option tout en restant en UTF-8,
* les caractères non ASCII seront remplacés par plusieurs « _ »
* au lieu d'un seul par caractère.
*/
$string = preg_replace("/[^A-Za-z0-9_.-]/u", "_", $string);
function getRewriteString($string) { /* * Première étape : on supprime les accents et cédilles des * lettres accentuées pour les ramener dans la table ASCII. * On convertit aussi les ligatures Æ, æ, ¼, ½ et ß en leurs * équivalents à deux lettres. */ $conversions = array( /* * Tous les caractères suivants sont dans Latin9 et bien sûr * dans UTF-8. Si vous êtes en Latin1, retirer les caractères * suivants : ¦¨´¸¼½¾ (dans les commentaires aussi). * Inversement, en UTF-8 vous pouvez ajouter d'autres * caractères à cette liste. */ "À"=>"A", "Á"=>"A", "Â"=>"A", "Ã"=>"A", "Ä"=>"A", "Å"=>"A", "à"=>"a", "á"=>"a", "â"=>"a", "ã"=>"a", "ä"=>"a", "å"=>"a", "Æ"=>"AE", "æ"=>"ae", "Ç"=>"C", "ç"=>"c", "È"=>"E", "É"=>"E", "Ê"=>"E", "Ë"=>"E", "è"=>"e", "é"=>"e", "ê"=>"e", "ë"=>"e", "Ì"=>"I", "Í"=>"I", "Î"=>"I", "Ï"=>"I", "ì"=>"i", "í"=>"i", "î"=>"i", "ï"=>"i", "Ñ"=>"N", "ñ"=>"n", "Ò"=>"O", "Ó"=>"O", "Ô"=>"O", "Õ"=>"O", "Ö"=>"O", "ò"=>"o", "ó"=>"o", "ô"=>"o", "õ"=>"o", "ö"=>"o", "¼"=>"OE", "½"=>"oe", "¦"=>"S", "¨"=>"s", "ß"=>"ss", "Ù"=>"U", "Ú"=>"U", "Û"=>"U", "Ü"=>"U", "ù"=>"u", "ú"=>"u", "û"=>"u", "ü"=>"u", "Ý"=>"Y", "¾"=>"Y", "ý"=>"y", "ÿ"=>"y", "´"=>"Z", "¸"=>"z" ); $string = strtr($string, $conversions);
/* * Deuxième étape : tout caractère qui n'est pas une lettre, un * chiffre, le point (.), le trait d'union (-) ou le blanc souligné * (_) est remplacé par un blanc souligné. * Attention : supprimer l'option « u » si vous n'êtes pas en * UTF-8. Si vous supprimez cette option tout en restant en UTF-8, * les caractères non ASCII seront remplacés par plusieurs « _ » * au lieu d'un seul par caractère. */ $string = preg_replace("/[^A-Za-z0-9_.-]/u", "_", $string);
return $string; }
paul
In article <45a552a3$, Olivier Miakinen <om+ wrote:
Mais alors que faire ?
Voici une proposition, non testée.
Merci Olivier. Ça fonctionne :
ÇaCoÛteZéro¤Piece.jpg devient CaCouteZero_Piece.jpg
Entre-temps puisque je ne peux pas utiliser iconv sur mon hébergement, j'avais essayé d'encadrer ma fonction par:
Peut-être parce que tu avais au moins un caractère qui ne fait pas partie de ISO-8859-1. Ah non, déjà c'est parce que tu as inversé les paramètres to_encoding et from_encoding. Cela dit, en lisant les commentaires accompagnant cette fonction je vois que tu aurais pu essayer « mb_convert_encoding($string,"HTML-ENTITIES","UTF-8") » suivi de ton preg_replace sur les entités -- mais ç'aurait été plus compliqué.
Au passage, puisque à la fin du traitement il ne reste que de l'ASCII, retransformer en UTF-8 ne sert à rien (tout ce qui est de l'ASCII se retrouve automatiquement valide en ISO-8859-* et en UTF-8).
Merci Olivier.
Ça fonctionne :
ÇaCoÛteZéro¤Piece.jpg
devient
CaCouteZero_Piece.jpg
Génial ! (je suppose que tu avais un û au lieu d'un Û)
Entre-temps puisque je ne peux pas utiliser iconv sur mon hébergement,
j'avais essayé d'encadrer ma fonction par:
Peut-être parce que tu avais au moins un caractère qui ne fait pas
partie de ISO-8859-1. Ah non, déjà c'est parce que tu as inversé les
paramètres to_encoding et from_encoding. Cela dit, en lisant les
commentaires accompagnant cette fonction je vois que tu aurais pu
essayer « mb_convert_encoding($string,"HTML-ENTITIES","UTF-8") »
suivi de ton preg_replace sur les entités -- mais ç'aurait été plus
compliqué.
Au passage, puisque à la fin du traitement il ne reste que de l'ASCII,
retransformer en UTF-8 ne sert à rien (tout ce qui est de l'ASCII se
retrouve automatiquement valide en ISO-8859-* et en UTF-8).
Peut-être parce que tu avais au moins un caractère qui ne fait pas partie de ISO-8859-1. Ah non, déjà c'est parce que tu as inversé les paramètres to_encoding et from_encoding. Cela dit, en lisant les commentaires accompagnant cette fonction je vois que tu aurais pu essayer « mb_convert_encoding($string,"HTML-ENTITIES","UTF-8") » suivi de ton preg_replace sur les entités -- mais ç'aurait été plus compliqué.
Au passage, puisque à la fin du traitement il ne reste que de l'ASCII, retransformer en UTF-8 ne sert à rien (tout ce qui est de l'ASCII se retrouve automatiquement valide en ISO-8859-* et en UTF-8).