PHP scandir et accents

PHP scandir et accents - PHP - Programmation

Marsh Posté le 09-09-2010 à 17:25:34    

:hello:  
 
Je souhaite récupérer des caractères que je considère comme non-autorisés pour ensuite les indiquer à l'utilisateur.

Code :
  1. $matches    = array();
  2. preg_match_all('@([^[:alnum:]_-])+@ui', 'ém1te nânt2', $matches);
  3.  
  4. var_dump($matches);
Code :
  1. array
  2.   0 =>
  3.     array
  4.       0 => string 'é' (length=2)
  5.       1 => string ' ' (length=1)
  6.       2 => string 'â' (length=2)
  7.   1 =>
  8.     array
  9.       0 => string 'é' (length=2)
  10.       1 => string ' ' (length=1)
  11.       2 => string 'â' (length=2)

Ma regex correspond à ce que je veux, et le résultat est ce que j'attends. Parfait.
 
Par contre, dans mon contexte d'utilisation (je récupère des noms de fichier en faisant un scandir), j'obtiens ça :
 
http://hfr-rehost.net/self/pic/55af1625cc8c94b472c81a5832736b07e9141594.png
 
Il semblerait que ça proviennent de la fonction scandir elle-même ( http://fr2.php.net/manual/fr/funct [...] .php#96140 ). Même problème avec readdir.
 
Comment je peux faire en sorte que ça fonctionne ?
 

Spoiler :

Et si Gatsu35 passe par là : http://pastebin.com/EP079KnZ ;)


 
 :jap:

Reply

Marsh Posté le 09-09-2010 à 17:25:34   

Reply

Marsh Posté le 09-09-2010 à 17:38:12    

http://pastebin.com/EP079KnZ ?

 

edit : ce n'est pas de moi

Message cité 1 fois
Message édité par flo850 le 09-09-2010 à 17:38:27
Reply

Marsh Posté le 09-09-2010 à 17:40:29    

utf8_encode ?


---------------
Créer votre blog gratuitement
Reply

Marsh Posté le 09-09-2010 à 17:41:37    

flo850 a écrit :

http://pastebin.com/EP079KnZ ?
 
edit : ce n'est pas de moi


Tu as cliqué sur le spoiler ?  [:petrus75]  

Spoiler :

Bon, j'ai peut-être mal expliqué sur pastebin [:transparency]


Nico5779 a écrit :

utf8_encode ?

J'ai déjà essayé, ça ne fonctionne pas. Le nom du fichier est déjà en UTF-8.

Message cité 1 fois
Message édité par BeGiNNeR02 le 09-09-2010 à 17:44:28
Reply

Marsh Posté le 09-09-2010 à 17:42:55    

à non :d

 

amsi ton code dis que ça marche , je suis pas allé plus loin


Message édité par flo850 le 09-09-2010 à 17:43:18
Reply

Marsh Posté le 09-09-2010 à 17:45:23    

Oui, je donnais un exemple qui fonctionnait :D (mais ce n'est pas avec scandir )
 
Edit: on peut pas éditer sur pastebin ? [:petrus75]


Message édité par BeGiNNeR02 le 09-09-2010 à 17:47:56
Reply

Marsh Posté le 09-09-2010 à 22:33:42    

BeGiNNeR02 a écrit :

J'ai déjà essayé, ça ne fonctionne pas. Le nom du fichier est déjà en UTF-8.


et ta page est en utf-8 aussi (encodage + en tête)

Reply

Marsh Posté le 09-09-2010 à 22:59:33    

Oui :/

Reply

Marsh Posté le 10-09-2010 à 01:52:40    

ton

Code :
  1. var_dump($file."::".mb_detect_encoding($file));


 
ca donne quoi ?

Reply

Marsh Posté le 10-09-2010 à 01:58:23    

fais comme ca
/[^a-z0-9_-]/ui

 

alnum en mode utf-8 ca comprend aussi les accents

 

sinon ca sert a quoi ton code ? avec la lib SPL ca serait beaucoup plus simple de reproduire la même chose

Message cité 1 fois
Message édité par stealth35 le 10-09-2010 à 02:22:15
Reply

Marsh Posté le 10-09-2010 à 01:58:23   

Reply

Marsh Posté le 10-09-2010 à 09:59:51    

Je commente mon morceau de code (qui est dans un fichier en UTF-8, no BOM) :
 

Code :
  1. <?php
  2.  
  3. /*
  4.  
  5. Scandir does not work properly with non-english caracters (like french accents for example : éàçè...) in the files name.
  6. As PHP does not support unicode operations until PHP 6, this is not a bug.
  7. */
  8.  
  9. //-- je dis que j'ai de l'UTF-8 partout
  10. mb_http_output("UTF-8" );
  11. mb_http_input("UTF-8" );
  12.  
  13. iconv_set_encoding("internal_encoding", "UTF-8" );
  14. iconv_set_encoding("output_encoding", "UTF-8" );
  15. iconv_set_encoding("input_encoding", "UTF-8" );
  16.  
  17. header('Content-Type: text/html; charset=utf-8');
  18. //--
  19.  
  20. //-- Ma fonction (non récursive) qui me liste les fichiers d'un répertoire
  21. function list_directory( $directory )
  22. {
  23.     $result    = array();
  24.     
  25.     if( !is_dir($directory) ) {
  26.         return $result;
  27.     }
  28.     
  29.     $files = scandir( $directory );
  30.     
  31.     foreach($files as $entry) {
  32.     
  33.         if( $entry == '.' || $entry == '..' ) {            
  34.             continue;
  35.         }
  36.         
  37.         if( !is_dir($directory .'/'. $entry) ) {
  38.             $result[]    = $entry;
  39.         }
  40.     
  41.     }
  42.     
  43.     return $result;
  44. }
  45. //--
  46.  
  47.  
  48. // Le dossier à parcourir
  49. $directory    = realpath(dirname(__FILE__) .'/test_scandir/');
  50.  
  51. // Tableau des fichiers du répertoire
  52. $files    = list_directory($directory);
  53.  
  54. foreach($files as $file) { // pour chaque fichier...
  55.     var_dump($file."::".mb_detect_encoding($file)); // ... j'affiche le nom du fichier et son encodage. Si le fichier a des accents : on les voit bien, et l'encodage est bien de l'UTF-8
  56.     
  57.     $matches    = array();
  58.     preg_match_all('/[^a-z0-9_-]/ui', $file, $matches);
  59.     
  60.     var_dump($matches); // Si le fichier a des accents : je ne les récupère pas bien ici...
  61. }
  62.  
  63.  
  64. //-- ... par contre, si j'ai ça :
  65. $string        = "épongé à la main";
  66.  
  67. var_dump($string."::".mb_detect_encoding($string)); // Affichage des accents OK, encodage UTF-8
  68.  
  69. $matches    = array();
  70. preg_match_all('/[^a-z0-9_-]/ui', $string, $matches);
  71.  
  72. var_dump($matches); // je récupère bien les accents
  73. //--
  74.  
  75. ?>


J'ai changé la regex, mais ça donne le même résultat (aux parenthèses près).
 

stealth35 a écrit :

fais comme ca
/[^a-z0-9_-]/ui
 
alnum en mode utf-8 ca comprend aussi les accents
 
sinon ca sert a quoi ton code ? avec la lib SPL ca serait beaucoup plus simple de reproduire la même chose


De quelle manière ?
 
:jap:


Message édité par BeGiNNeR02 le 10-09-2010 à 10:00:28
Reply

Marsh Posté le 10-09-2010 à 15:44:50    

si ton but c'est de récupérer les fichiers qui comportent les caractères non autorisé,  
 
Filesystemiterator + FilterIterator  ca devrait le faire

Reply

Marsh Posté le 10-09-2010 à 16:14:28    

Je vais regarder ça :jap:
 
Sinon, l'utilisation que j'en fais c'est : un utilisateur peut envoyer un ZIP, le système le dézippe et vérifie les fichiers (et en particulier leur nom) qui étaient à l'intérieur (après un scandir, donc, du répertoire dans lequel on a dézippé). Si il y a des caractères non autorisés, je dois dire lesquels... d'où ma regex avec preg_match_all.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed