Raccourcir intelligemment une url pour l'affichage sur une page

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 683 fois - Téléchargée 23 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
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1 -
:)
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
-
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
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1 -
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
-
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
-
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.