En uno de los proyectos en los que estamos trabajando actualmente tenemos una especie de buscador web y en los resultados se muestran los enlaces completos de las páginas web que aparecen en los resultados. El problema es que algunos de esos enlaces ocupaban varias líneas y el modo de “cortar” esas líneas no me convencía porque se cortaban por cualquier carácter. Lo que yo buscaba era una función similar al wordwrap de php pero para urls.
Al final tras no encontrarla me decidí a escribir mi propia funcion, urlWrap. Mi función recibe dos parámetros, la url que queremos dividir en varias líneas y el tamaño máximo de cada línea. Lo que hace básicamente es dividir la url en varias líneas a partir de los caracteres &?/ dándoles prioridad por ese orden. Esos caracteres aparecen declarados en la variable $chars al comienzo de la funcion por lo que si alguien necesita otros caracteres sólo tiene que modificarlos ahí o incluso añadirlos como tercer parámetro a la función.
La página en concreto es la siguiente (SEPG, Links de interés) (Lo siento pero no se ve bien en Firefox..)
El resultado es que dos enlaces que antes se veían así:
http://www.canadian-health-network.ca/servlet/Conten
tServer?cid=1038611684536&pagename=CHN-RCS%2FPage%2F
HomePageTemplate&c=Page?=En
http://www.healthnewsdirectory.com/doctordirectory/d
efault.aspx?404;http://www.healthnewsdirectory.com/h
ealthNews/directory/default.asp
Ahora se ven así:
http://www.canadian-health-network.ca/servlet/
ContentServer?cid=1038611684536&
pagename=CHN-RCS%2FPage%2FHomePageTemplate&c=Page&
lang=En
http://www.healthnewsdirectory.com/doctordirectory/
default.aspx?
404;http://www.healthnewsdirectory.com/healthNews/
directory/default.asp
Esta es mi función, seguro que se puede optimizar pero al menos funciona:
function urlWrap($fullUrl,$lineMaxSize)
{
$chars=”&?/”;
$newLine=”";
$newUrl=”";
$lineSize=0;
$pos=0;
$maxPos=strlen($fullUrl);
while($pos < $maxPos)
{
$iChar=0;
$maxChar=strlen($chars);
$trozo=”";
// Cojo un trozo del tamaño máximo de línea
$trozotmp=substr($fullUrl,$pos,$lineMaxSize);
// Doy prioridad a los caracteres según aparecen
while($iChar < $maxChar)
{
$char=substr($chars,$iChar,1);
$trozo=”";
$posChar=strrpos($trozotmp,$char);
// Si lo encuentro
if(!$posChar===False)
{
$posChar+=1;
// Si la posición no excede del máximo de línea, se lo pegamos a la línea actual
if($lineSize + $posChar < = $lineMaxSize)
{
$trozo=substr($fullUrl,$pos,$posChar);
$newUrl.=$trozo;
$lineSize+=strlen($trozo);
$pos+=$posChar;
$newUrl.=$newLine;
$lineSize=0;
break;
}
}
// Sino, probamos con el siguiente caracter separador
$iChar++;
}
// Si no se encontró ninguno de los caracteres en los límites definidos, ‘cortamos por lo sano’
if($trozo ==”" && $pos < $maxPos)
{
$newUrl.=substr($fullUrl,$pos,$lineMaxSize-$lineSize);
$newUrl.=$newLine;
$pos+=$lineMaxSize-$lineSize;
$lineSize=0;
}
// Por último si el trozo que queda es menor que el máximo de línea, lo añadimos directamente
if($maxPos-$pos <= $lineMaxSize)
{
$newUrl.=substr($fullUrl,$pos);
$newUrl.=$newLine;
break;
}
}
return $newUrl;
}
La indentación del código la conseguí gracias a: SimpleCode. Eso sí, cada vez que edito la entrada en WordPress, vuelve a perderla..
Si tenéis WordPress alojado en vuestro servidor, podéis usar el siguiente Plug-In: http://wordpress.org/extend/plugins/syntaxhighlighter/ ¿Porqué en WordPress.com no pueden instalarse Plugins??