ereg Vs preg_match

Eléphanteau du PHP | 44 Messages

05 sept. 2012, 09:07

J'avais mis au point il y a quelques années un script d'upload et pour vérifier mon nom de fichier j'utilisais ceci:
ereg("\.([^\.]*$)", $fichier_name, $elts);
$extension_fichier=$elts[1];
Bon du coup maintenant avec les maj de php, la fonction est obsolète, mais je n'arrive pas à faire l'équivalent avec preg_match.

Si vous pouviez m'aider un ch'tit coup, ce serait gentil

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

05 sept. 2012, 09:30

salut,


la doc de la fonction ereg t'indique ceci http://fr2.php.net/manual/fr/reference. ... .posix.php


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 44 Messages

05 sept. 2012, 10:32

bonjour Moogli!
Alors j'ai bien essayé de mettre les délimiteurs, ce qui fait que je n'ai plus le message d'erreur correspondant, mais mon script semble s'arrêter sans message.
Il s'agit d'un script d'upload.
Ca fait longtemps que je ne m'y suis pas collé et j'ai un peu de mal.
voici la fonction complète:
function FileChecking($fichier_name, $fichier_size){

	global $strErrorExtension;
	global $strErrorFilesize;
	global $taille_max;
	global $fileExtensionsAllowed;

   [color=#FF0000]preg_match("/\.([^\.]*$)/i", $fichier_name, $elts);
   $extension_fichier=$elts[1];[/color]   if(!in_array($extension_fichier, $fileExtensionsAllowed)){
	
	   foreach($fileExtensionsAllowed as $ext){
	       $str_ext .= ".$ext ";
      }

	   echo $strErrorExtension." ".$str_ext."<br><br>";
      logError("Bad File extension ($extension_fichier) ");
      makeReturn();
      signMTA();
      exit;
   }

   if($fichier_size > $taille_max){
	   echo $strErrorFilesize."<br><br>";
	   logError("File Size ($fichier_size) ");
      makeReturn();
      signMTA();
      exit;
   }
}

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

05 sept. 2012, 14:06

vire les exit et toutes les redirections.

Ajoute des else aux if afin de suivre le chemin emprunté.

tu peux aussi utiliser un debugguer


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 44 Messages

05 sept. 2012, 14:31

J'ai donc fait ceci:
function FileChecking($fichier_name, $fichier_size){

	global $strErrorExtension;
	global $strErrorFilesize;
	global $taille_max;
	global $fileExtensionsAllowed;

   preg_match("/\.([^\.]*$)/i", $fichier_name, $elts);
   $extension_fichier=$elts[1];

   if(!in_array($extension_fichier, $fileExtensionsAllowed)){
	
	   foreach($fileExtensionsAllowed as $ext){
	       $str_ext .= ".$ext ";
      }

	   echo $strErrorExtension." ".$str_ext."<br><br>";
      logError("Bad File extension ($extension_fichier) ");
      makeReturn();
      signMTA();

   }
   else {
   echo "erreur 01";
   }

   if($fichier_size > $taille_max){
	   echo $strErrorFilesize."<br><br>";
	   logError("File Size ($fichier_size) ");
      makeReturn();
      signMTA();

   }
   else {
   echo "erreur 02";
   }
}
les 2 echo s'affichent.
Je ne comprends pas pourquoi avec ereg ça marchait sans aucun souci et la avec preg_match plus du tout #-o

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

05 sept. 2012, 15:11

Et comme ceci ?
preg_match("/\.([^.]*)$/", $fichier_name, $elts);
$ en dehors de la parenthèses puisque non capturable et suppression du \ puisque entre crochets on indique directement les caractères
Nota : le i(gnoreCase) sert à rien puisque l'expression ne contient ni minuscules, ni majuscules
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 44 Messages

05 sept. 2012, 15:21

Bonjour,
J'ai fait la modif, merci a toi.
malheureusement, ça ne fonctionne pas mieux.
Pas de message d'erreur, mais pas d'upload non plus.

Quelle différence entre ereg et preg_match pourrait occasioner ce disfonctionnement?

Merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

05 sept. 2012, 15:31

sans debuggage on ne peux pas t'aider.

il faut savoir :
- ce que tu passe comme argument à la fonction
- ce que tu souhaite obtenir
- que contient $elts avec le preg_match ?
- est ce que niveau de rapport d'erreur est bien à E_ALL ? (error_reporting(E_ALL) en première ligne)


si c'est "l'extension" du fichier tu peux l'avoir plus simplement avecstrrchr et substr

pour finir un peu de lecture explique moi le debuggage :)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 44 Messages

05 sept. 2012, 16:14

tout d'abord merci à vous 2 de m'épauler si gentillement !

pour essayer de faire les choses dans l'ordre:
Ce script est un script édité il y a plusieurs années (pas par moi)
Je n'en maitrise malheureusement clairement pas tout le code.

je viens d'activer le rapport d'erreur qui me donne ceci:
Notice: Use of undefined constant upload - assumed 'upload' in /patatipatata/upload/index.php on line 43

Notice: Undefined variable: a in /patatipatata/upload/index.php on line 43
alors qu'avec ereg tout fonctionnait sans aucun problème.
Je pense effectivement vu l'ensemble de la fonction que le script a cet endroit vérifie que l'extension est valide.
$elts(j'imagine) ressort l'extension, ça me semble assez logique.
Je vais essayer ta méthode et j'espere que ca va marcher car j'ai mon équipe qui me tombe dessus là :?

Merci à toi

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

05 sept. 2012, 20:15

l'extension
<?php
$fichier_name = 'monfichier.php';
$extension_fichier = strrchr($fichier_name, '.');
?>
donne
string '.php' (length=4)
après tu peux virer le point si besoin :) (avec substr)

quand aux reste on peux t'aider, mais faut le script.

ce genre de message d'erreur est du à une chaine de caractère qui n'est pas entouré de ' ou de "

genre $_GET[truc] au lieu de $_GET['lieu'] :mrgreen:


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 44 Messages

06 sept. 2012, 09:21

oui, ca fonctionne à nouveau.
Je vais passer à la suite, mais je reviendrai sur le sujet car j'aimerai quand même comprendre pourquoi le preg_match ne fonctionne pas (ne renvoie rien en fait).

Merci à vous 2 pour votre patience :D

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

06 sept. 2012, 15:00

la le truc c'est clairement de trouver le bon masque, et il y a quelques différences entre les expressions régulières POSIX (erg) et les PRCE (preg_*).

sinon de rien ;)


peux tu cliquer sur le bouton résolu en haut de la page mici :mrgreen:


@+
Il en faut peu pour être heureux ......