8791 sujets

Développement web côté serveur, CMS

Bonjour,
J'ai un problème avec mon parseur d'URL. En effet, cette fonction permet de transformer par exemple :
http://legeekcafe.com

en :
<a href="http://legeekcafe.com">http://legeekcafe.com</a>

Pour l'instant, tout marche. Mais quand j'écris :
<a href="http://www.apprendre-php.com/">http://www.apprendre-php.com/</a>

il me transforme en
<a href="%3Ca%20href="  http:=""   www.apprendre-php.com=""  "="">http://www.apprendre-php.com/</a>"><a href="http://www.apprendre-php.com/">http://www.apprendre-php.com/</a>


et
<a href="http://www.apprendre-php.com/">Test</a>

en
<a href="%3Ca%20href="  http:=""   www.apprendre-php.com=""  "="">http://www.apprendre-php.com/</a>">Test

Voici mon code :
function bbCode($t)
// remplace les balises BBCode par des balises HTML
{
   //lien
	$t = preg_replace('#http://[a-z0-9._/-]+#i', '<a href="$0">$0</a>', $t);
    $t = preg_replace('#https://[a-z0-9._/-]+#i', '<a href="$0">$0</a>', $t);
    $t = preg_replace('#ftp://[a-z0-9._/-]+#i', '<a href="$0">$0</a>', $t);


	return $t;
}

Merci de votre aide !
Modifié par doc mcfly (21 Jul 2011 - 11:24)
Tu peux utiliser une expression régulière pour extraire une URL dans une chaine et l'utiliser ensuite pour créer ton lien.
J'ai trouvé ce code pas tu tout optimiser. Comment l'optimiser ?
function bbcode($t) 
{
	$t = parselien($t);
	return $t;
}
// Parser Liens
function parselien($text)
{
	$ret = ' ' . $text;
	$ret = preg_replace_callback("!(^|[\n ])(https?://[^ \"\n\r\t<]*)!is", "regexp_http", $ret);
	$ret = preg_replace_callback("!(^|[\n ])((www|ftp)\.[^ \"\t\n\r<]*)!is", "regexp_http", $ret);
	$ret = preg_replace_callback("!(^|[\n ])([a-z0-9&\-_.\S]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)!i", "regexp_mail", $ret);
	$ret = preg_replace_callback("!(^|[\n ])(ftp?://[^ \"\n\r\t<]*)!is", "regexp_ftp", $ret);
	$ret = substr($ret, 1);
	return($ret);
}

function shorten($value, $length = 50)
{
	if (strlen($value) > $length) {
	return substr($value , 0, 35 ) . '...' . substr($value , -15);
	}
	else {
	return $value;
	}
}

function regexp_http($value, $http = '', $end = '')
{
	if (!preg_match("!^http!", $value[2]))
	$http = 'http://';
	if (preg_match("!([\.,\?\!]+)$!", $value[2], $match))
	{
	$end = $match[1];
	$value[2] = preg_replace("!([\.,\?\!]+)$!", "", $value[2]);
	}
	return $value[1] . '<a href="' . $http . $value[2] . '">' . $value[2] . '</a>' . $end;
}

function regexp_ftp($value, $ftp = '', $end = '')
{
	if (!preg_match("!^ftp!", $value[2]))
	$ftp = 'ftp://';
	if (preg_match("!([\.,\?\!]+)$!", $value[2], $match))
	{
	$end = $match[1];
	$value[2] = preg_replace("!([\.,\?\!]+)$!", "", $value[2]);
	}
	return $value[1] . '<a href="' . $ftp . $value[2] . '">' . $value[2] . '</a>' . $end;
}

function regexp_mail($value, $end = '')
{
	if (preg_match("!([\.,\?\!]+)$!", $value[2], $match))
	{
	$end = $match[1];
	$value[2] = preg_replace("!([\.,\?\!]+)$!", "", $value[2]);
	}
	return $value[1] . '<a href="mailto:' . $value[2] . '@' . $value[3] . '">' . $value[2] . '@' . $value[3] . '</a>' . $end;
}
Je vois pas en quoi récupérer un code tout fait sur le net et demander comment l'optimiser entre dans un cadre d'apprentissage. Donc pour ma part : non.