Raccourcir intelligemment une url pour l'affichage sur une page

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 890 fois - Téléchargée 25 fois

Contenu du snippet

Cette fonction réduit, quand c'est nécessaire, la longueur d'une URL en vue de l'afficher sur une page Web pour que la mise en page de celle-ci ne soit pas déformée par une URL trop grande.

Plutot que de supprimer la fin de l'URL, la fonction remplace les noms de dossier au milieu de l'URL par des points ; concrétement par "(...)".

Inutile de préciser que ces URLs ne marchent plus, évidemment :o|

Source / Exemple :


function ShortDisplayURL($FullPath,$MaxLenght=150)
	{
    If (strlen($FullPath) > $MaxLenght)
		{
		//Suppression des arguments et fragment si nécessaire
		if (strpos($FullPath,"#",0) > 0) $FullPath = substr($FullPath,0,strpos($FullPath,"#",0));
		if (strpos($FullPath,"?",0) > 0) $FullPath = substr($FullPath,0,strpos($FullPath,"?",0));
		
	    If (strlen($FullPath) > $MaxLenght)
			{
			// Decompose l'URL
			$FullPathParsed=parse_url($FullPath);
			// Parties minimales
	        $RootPath = $FullPathParsed['scheme'].'://'.$FullPathParsed['host'];
			// Slash de fin si dossier
			if (substr($FullPathParsed['path'],-1) == '/')
				{
				$FullPathParsed['path'] = substr($FullPathParsed['path'],0,-1);
				$isFolder = TRUE;
				}
			else
				{
				$isFolder = FALSE;
				}
			$PathBaseName = basename($FullPathParsed['path']);
			$FullPathParsed['path'] = substr($FullPathParsed['path'],0,-1*strlen($PathBaseName)-1);
			// Pas besoin de citer l'index
			if (($PathBaseName == 'index.html') OR ($PathBaseName == 'index.php') OR ($PathBaseName == 'index.php3'))
				{
				$FullPathParsed['path'] = substr($FullPathParsed['path'],0,-1*strlen($PathBaseName)-1);
				$PathBaseName = basename($FullPathParsed['path']);
				$isFolder = TRUE;
				}
								
			if ($PathBaseName == '')
				{
				if (strlen($RootPath) > $MaxLenght) $RootPath = $FullPathParsed['scheme'].'://'.ShortDisplayHost($FullPathParsed['host'],$MaxLenght - strlen($FullPathParsed['scheme']) - 3);
				
				return $RootPath;
				}
			else if ($FullPathParsed['path'] == '')
				{
				return $RootPath.'/?/'.$PathBaseName;
				}
			else if ((strlen($RootPath)+strlen($PathBaseName)+3) >= $MaxLenght)
				{
				return $RootPath.'/?/'.$PathBaseName;
				}
			else
				{
				// Reduction du chemin
				while ((strlen($RootPath)+strlen($PathBaseName)+strlen($FullPathParsed['path'])+3) > $MaxLenght)
					{
					$FullPathParsed['path'] = substr($FullPathParsed['path'],0,-1*strlen(basename($FullPathParsed['path']))-1);
					}
					
				if ($FullPathParsed['path'] == '')
					{
					return $RootPath.'/?/'.$PathBaseName;
					}
				else
					{
					return $RootPath.$FullPathParsed['path'].'/?/'.$PathBaseName;
					}
				}
			}
	    Else
			{
	        return $FullPath;
			}
		
		}
    Else
		{
        return $FullPath;
		}
	}
	
function ShortDisplayHost($FullHost,$MaxLenght=80)
	{
	If (strlen($FullHost) > $MaxLenght)
		{
		if (substr_count($FullHost,'.') >= 2)
			{
			return $FullHost;
			}
		else if (substr_count($FullHost,'.') == 1)
			{
			$extension = substr($FullHost,strpos($FullHost,".",0));
			$FullHost = substr($FullHost,0,strpos($FullHost,".",0));
			$FullHost = substr($FullHost,0,10).'(?)'.substr($FullHost,-1*(10+3+1+strlen($extension))).'.'.$extension;
			}
		else
			{
			$FullHost = substr($FullHost,0,$MaxLenght-3).'(?)';
			}
		}
	else
		{
		return $FullHost;
		}
	}
	
function ShortDisplayName($FullName,$MaxLenght=50)
	{
	If (strlen($FullName) > $MaxLenght)
		{
		$FullName = substr($FullName,0,$MaxLenght-3).'(?)';
		return $FullName;
		}
	else
		{
		return $FullName;
		}
	}

A voir également

Ajouter un commentaire Commentaires
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
17 oct. 2006 à 21:47
:)
jtrouve aussi que certaines fonctions en php seraient à améliorer mais bon .. ca reste un bon langage pour pas trop se prendre la tête en réalisant de bonnes applications :)
cs_olid Messages postés 296 Date d'inscription lundi 2 septembre 2002 Statut Membre Dernière intervention 28 janvier 2008
17 oct. 2006 à 12:46
Oui, ca serait pas tres dur à faire, mais je voulais que l'URL soit raccourcie en gardant une structure facile à comprendre... Mais si tu regarde, c'est un peu ce que je voulais faire pour le nom de domaine (fonction Host). D'ailleur, cette fonction est incompléte :o|

La partie pour le nom de domaine est un peu brutale, on pourrait appliquer le meme principe en décomposant les mots séparés par un tiret... Si ya des volontaires, d'avance merci ;o)
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
17 oct. 2006 à 11:31
Tu pourrais aussi faire plus simple éventuellement :
en algo :
tu prends la chaine, tu lui garde n charactères au début ( substr(machaine, 0, n); ), ensuite tu récupère n caractères en partant de la fin ( substr(machaine, -6); ), et tu affiche le premier substr, trois petits points, et ensuite le deuxieme substr

sinon tu peux aussi afficher qu'apres le dernier slash pour la derniere partie :)

Mais bon l'idée n'est pas mal :)
cs_olid Messages postés 296 Date d'inscription lundi 2 septembre 2002 Statut Membre Dernière intervention 28 janvier 2008
6 oct. 2006 à 13:03
Oui, pourquoi pas... d'ailleur, on peut simuler un wordwrap via les styles CSS.

Mais le but, ici, c'est que l'URL soit affichée sur une seule ligne... C'est presque comme ce que fait phpBB
Sniperman113 Messages postés 99 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 21 février 2012
5 oct. 2006 à 22:05
Wordwrap tout aussi efficace et l'url marche toujours :)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.