Redimensionner les images, si nécessaire (pour forum)

Invité
Invité n'ayant pas de compte PHPfrance

18 juin 2006, 15:26

Bonjour à tous !
Alors j'ai créé mon propre système de forum, utilisant du BBCode. Cependant, je suis régulièrement gêné par des images postées qui sont trop grandes. Je voudrais donc, que si les images ont une largeur supérieure à 350 pixels, l'attribut width="350" soit ajouté à la balise <img> obtenue avec le BBCode. Je ne souhaite pas que les images soient "miniaturisées" et stockées sur mon serveur (pour des questions évidentes de place et de bande passante), mais simplement qu'elles soient redimensionnées dans le forum. Comment puis je faire cela ?
Voici les passages concernés de ma fonction bbcode :

Code : Tout sélectionner

function code($chaine) { $chaine = preg_replace('#\[img=(.+?)](.+?)\[/img]#si','<img src="$1" border="0" alt="$2" />',$chaine); $chaine = preg_replace('#\[img](.+?)\[/img]#si','<img src="$1" border="0" alt="" />',$chaine); }
Il faudrait donc le cas échéant ajouter un width="350" ... Comment puis-je m'y prendre ? Faut il le faire juste avant d'insérer le message dans la BDD ou à l'affichage des messages ?

D'avance merci pour votre aide :)

ViPHP
ViPHP | 3607 Messages

18 juin 2006, 16:21

avec getimagesize(), tu devrais pouvoir y arriver tout seul...
un exemple d'utilisation tirer des commentaire du manuel php: http://fr2.php.net/getimagesize
<?php list($w, $h) = getimagesize("image.jpg") ?>
  <img src="image.jpg" style="width: <?php=$w?>px; height: <?php=$h?>px;" />

Invité
Invité n'ayant pas de compte PHPfrance

18 juin 2006, 16:30

Merci jojolapine, effectivement, je pensais à cette fonction, mais c'est plutôt la suite qui me contrarie... parceque dans le post, il n'y a pas que des images...
$chaine = preg_replace('#\[img=(.+?)](.+?)\[/img]#si','<img src="$1" border="0" '.if(getimagesize($1)>"350") echo" width=\"350\"";.' alt="$2" />',$chaine); 
Je pensais à un truc comme ça... mais bon, c'est pas du PHP correct :s je ne sais pas comment l'intégrer en fait :s[/code]

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

18 juin 2006, 16:43

Déjà il faudrait corriger quelques petites erreurs ;)
- tu es en train de construire une chaine pour la stocker dans une variable, pas pour l'afficher à l'écran, le echo n'a donc rien à faire là :)
- si tu regardes la doc, tu verras que la fonction getImageSize() retourne un tableau de 4 éléménts et pas directement une largeur comparable à ton 350
- enfin dans une concaténation, tu ne peux utiliser de if(), à moins de l'écrire sous sa forme ternaire : ( (condition) ? alors : sinon ) :)

Invité
Invité n'ayant pas de compte PHPfrance

18 juin 2006, 17:25

Lol, bon je fais un autre essai :
$chaine = preg_replace('#\[img=(.+?)](.+?)\[/img]#si','<img src="$1" border="0" ;
list($width, $height, $type, $attr) = getimagesize($1);
if($width>"350)
{
$chaine .= " width=\"350\"";
}
$chaine .= " alt="$2" />',$chaine);
Je ne pense pas que ce soit ça, parce que le fait de couper la fonction comme ça, ça ne le fait pas :s comment faire alors ?[/code]

Invité
Invité n'ayant pas de compte PHPfrance

19 juin 2006, 00:40

Personne ne peut m'éclairer ?

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

19 juin 2006, 11:14

Tu n'es pas loin, il te faut juste pour pouvoir faire cela, faire appel à une fonction dans ton remplacement, par exemple :
function checkWidth($img, $maxWidth) {
	$tab = getimagesize($img); // on récupère la taille de l'image
	if($tab[0] > $maxWidth) // si la largeur est supérieure à maxWidth
		return 'width="'.$maxWidth.'"'; // on retourne l'attribut width avé la taille qui va bien
}

// je rajoute un "e" dans le pattern pour que la fonction soit évaluée en php
$pattern = '#\[img=(.+?)](.+?)\[/img]#esi'; 
// transforme en chaine et ajoute l'appel à la fonction :
$replace = "'<img src=\"$1\" border=\"0\" '. checkWidth('$1', 350) . ' alt=\"$2\" />'"; 

$chaine = preg_replace($pattern, $replace, $chaine); // le remplcement
a tester, mais ca devrait faire ton affaire :)

Invité
Invité n'ayant pas de compte PHPfrance

21 juin 2006, 02:26

Merci pour ton aide ! ça fonctionne presque !
Le seul problème se situe là :checkWidth('$1', 350) . Visiblement, il ne reconnait pas $1, il ne sait pas à quoi renvoie cette variable. Il y a une incompréhension visiblement. J'ai essayé en mettant directement des adresses d'image et ça fonctionne... Donc je sais pas comment modifier pour qu'il sache ce qu'est $1

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

21 juin 2006, 10:13

Je viens de faire le test et j'ai pas eu de soucis, il me prend bien en compte les parenthèses capturantes dans $1 et $2 ....

Essayes éventuellement de les remplacer par \\1 et \\2 :?:

Invité
Invité n'ayant pas de compte PHPfrance

02 juil. 2006, 20:53

j'ai exactement le même problème que "invité" !
Warning: getimagesize(): Unable to access $1 in monsite/index.php on line 7

Warning: getimagesize($1): failed to open stream: No such file or directory in monsite//index.php on line 7
en fait il reconnait pas le $1, comment on peut faire ?

razoor
Invité n'ayant pas de compte PHPfrance

28 juil. 2006, 01:35

Bonjour,
J'obtiens une autre erreur quant à moi :
Parse error: parse error, unexpected '<' in "#####/fichier.php(23) : regexp code on line 1

Fatal error: preg_replace(): Failed evaluating code: <img src="http://####.gif" alt="" /> in #####/fichier.php on line 23"

Code de ma page :
	function checkWidth($img) {
     ini_set('allow_url_fopen', '1');
     if (@fclose(@fopen($img, 'r'))) {
    	$tab = getimagesize($img); // on récupère la taille de l'image
    	if($tab[0] > 350) return ' width="350"'; // on retourne l'attribut width avé la taille qui va bien
		}
Ligne d'expression régulière :
$chaine = preg_replace('#\<img src="(.+?)" alt="" />#sie','<img src="$1"'.checkWidth('$1').' alt="" />',$chaine);
Les images que j'utilise n'existent plus toujours, ce qui explique que j'utilise la vérification, pour savoir si l'image existe toujours sur le serveur distant (voire mon serveur).

Mammouth du PHP | 1511 Messages

28 juil. 2006, 01:39

Et en utilisant les css? Comme l'attribut max-width par exemple?
@+

razoor
Invité n'ayant pas de compte PHPfrance

28 juil. 2006, 01:53

Je te remercie momox, je ne connaissais pas cette propriété, mais elle n'est pas comprise par IE .. Après un petit tour sur google, j'ai vu qu'il existe certes des solutions pour y pallier, mais c'est pas recommandé , car c'est avec du langage propriétaire et du JS. Alors que je programme en XHTML 1.0 Strict

razoor
Invité n'ayant pas de compte PHPfrance

28 juil. 2006, 12:25

Personne ne pourait m'aiguiller par rapport à mon erreur ?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

28 juil. 2006, 12:49

pour tester l'existence d'un fichier il y a file_exists()

sinon pourquoi échapper le "<" en début d'expression?
et l'option "e" peut être pas obligatoire tout comme "s" :-k
$chaine = preg_replace('#<img src="(.+?)" alt="" />#i','<img src="$1"'.checkWidth('$1').' alt="" />',$chaine);
JE me demande même pour l'option "i"... les balises <img> tu les as mis en place tu sais comment elle sont construites (case).

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute