Page 1 sur 1

[Résolu] Appel de fonction php lors d'un preg_replace

Posté : 19 oct. 2011, 14:44
par Texicitys
Hello!

Dans mon bbcode, j'appelle une fonction pour complété les liens (ajouté http://, etc..).

Voici le code:
function handle_img_tag($url)
{
	
	$full_url = str_replace(array(' ', '\'', '`', '"'), array('%20', '', '', ''), $url);
	if (strpos($url, 'www.') === 0)			// If it starts with www, we add http://
		$full_url = 'http://'.$full_url;
	else if (strpos($url, 'ftp.') === 0)	// Else if it starts with ftp, we add ftp://
		$full_url = 'ftp://'.$full_url;
	else if (!preg_match('#^([a-z0-9]{3,6})://#', $url, $bah)) 	// Else if it doesn't start with abcdef://, we add http://
		$full_url = 'http://'.$full_url;

		$img_tag = '<img src="'.$full_url.'" alt="image" />';

	return $img_tag;
}

//
// Truncate URL if longer than 55 characters (add http:// or ftp:// if missing)
//
function handle_url_tag($url, $link = '')
{
	global $pun_user;

	$full_url = str_replace(array(' ', '\'', '`', '"'), array('%20', '', '', ''), $url);
	if (strpos($url, 'www.') === 0)			// If it starts with www, we add http://
		$full_url = 'http://'.$full_url;
	else if (strpos($url, 'ftp.') === 0)	// Else if it starts with ftp, we add ftp://
		$full_url = 'ftp://'.$full_url;
	else if (!preg_match('#^([a-z0-9]{3,6})://#', $url, $bah)) 	// Else if it doesn't start with abcdef://, we add http://
		$full_url = 'http://'.$full_url;

	// Ok, not very pretty :-)
	$link = ($link == '' || $link == $url) ? ((strlen($url) > 55) ? substr($url, 0 , 39).' &hellip; '.substr($url, -10) : $url) : stripslashes($link);

	return '<a href="'.$full_url.'">'.$link.'</a>';
}

$pattern = array('!\<img\>(.+)\</img\>!isU',
				'#\<lien url="([^\[<]*?)\">(.*?)\</lien\>#e');
$replace = array('handle_img_tag(\'$1\')',
				'handle_url_tag(\'$1\', \'$2\')');
// This thing takes a while! :)
$text = preg_replace($pattern, $replace, $text);
Une partie du code est pomper sur forum fluxbb.

Le soucis vient de cette partie du code:
$pattern = array('!\<img\>(.+)\</img\>!isU',
				'#\<lien url="([^\[<]*?)\">(.*?)\</lien\>#e');
$replace = array('handle_img_tag(\'$1\')',
				'handle_url_tag(\'$1\', \'$2\')');
// This thing takes a while! :)
$text = preg_replace($pattern, $replace, $text);
Lorsque je fais <lien url="xxx">lien</lien> tout va bien, ça donne le résultat voulu.

Mais lorsque je fais <img >xxx.png</img> Voici ce que j'obtiens:

Code : Tout sélectionner

handle_img_tag('xxx.png')
La fonction n'est donc pas appelée...

Je ne comprends pas. Pourtant les deux lignes sont pratiquement les mêmes et les fonctions aussi. D'un coté la fonction est exécuté sans problème et de l'autre, la fonction n'est pas exécuté mais le text ressort tel quel...

(je n'ai pas mis toute la page pour pas trop encombrer)

Merci de m'éclairer!
Tex

Re: Appel de fonction php lors d'un preg_replace

Posté : 19 oct. 2011, 15:09
par moogli
salut,

tu a mis un espace dans ton tag img donc il ne le trouve pas (<img > au lieu de <img> ensuite change le iUs et e dans le masque et ça roule

$pattern = array('!\<img\>(.+)\</img\>!e',
'#\<lien url="([^\[<]*?)\">(.*?)\</lien\>#e');

@+

Re: Appel de fonction php lors d'un preg_replace

Posté : 19 oct. 2011, 18:01
par Texicitys
Pour les bsalise oui c'était fait exprès. Je ne voulais pas prendre le risque que le forum php france aie les même balise (ce n'est pas le cas).

Merci énormément moogli !!!

En partie grâce à toi j'ai enfin finalisé mon bbcode de base !!

Je te remercie beaucoup! =D> =D> =D>

Texicitys