Foros del Web » Programando para Internet » PHP »

Dividir una url en varias líneas (urlWrap)

Estas en el tema de Dividir una url en varias líneas (urlWrap) en el foro de PHP en Foros del Web. Hola: Busco una función que me permita mostrar una url dividida en varias líneas a partir de un ancho dado. Sería algo similar al wordwrap ...
  #1 (permalink)  
Antiguo 27/09/2006, 06:13
 
Fecha de Ingreso: abril-2004
Mensajes: 19
Antigüedad: 20 años
Puntos: 0
Exclamación Dividir una url en varias líneas (urlWrap)

Hola:

Busco una función que me permita mostrar una url dividida en varias líneas a partir de un ancho dado. Sería algo similar al wordwrap de php pero que en lugar de dividir las líneas por espacios lo haga por barras (/), interrogaciones (?) y ampersands (&).

Como ejemplo, usando wordwrap, una url me aparece así:
xxxx://xxx.wellnessbooks.com/cgi-bin/search.pl?Operat
ion=ItemSearch&Keywords=psicogeriatria&SearchIndex =Bo
oks&templates=search


Y me gustaría que apareciera algo similar a esto:
xxxx://xxx.wellnessbooks.com/cgi-bin/
search.pl?Operation=ItemSearch&Keywords=psicogeria tria
&SearchIndex=Books&templates=search


Es decir, que sea capaz de romper líneas con los caracteres /&=

¿Alguna idea?

Gracias!
  #2 (permalink)  
Antiguo 27/09/2006, 12:53
 
Fecha de Ingreso: agosto-2006
Mensajes: 41
Antigüedad: 17 años, 8 meses
Puntos: 2
Hola jatubio,

Prueba esto:
Código PHP:
<?php
$str 
"xxxx://xxx.wellnessbooks.com/cgi-bin/search.pl?Operation=ItemSearch&Keywords=psicogeriatria&SearchIndex =Books&templates=search";
print_r (split'[/&=]'$str ));
?>
Si no es exactamente lo que deseas, jugando un poco con las expressiones regulares seguro que lo consigues

Albert Lanchas
  #3 (permalink)  
Antiguo 27/09/2006, 13:00
 
Fecha de Ingreso: abril-2004
Mensajes: 19
Antigüedad: 20 años
Puntos: 0
Gracias pero con ese código lo único que consigo es dividir en un array todos los elementos de la url, pero esas divisiones no me sirven para hacer lo que yo quiero que es decir "divídeme esta url en líneas de (por ejemplo) 47 caracteres máximo de largo cortándolas a ser posible en un carácter de estos: /&?"

Con tu código a lo máximo que podría llegar es a algo similar a esto:

xxxx://
xxx.wellnessbooks.com/
cgi-bin/
search.pl?
Operation=
ItemSearch
&Keywords
=psicogeria tria&
SearchIndex=
Books&templates=search


Que no queda muy bien, claro...
  #4 (permalink)  
Antiguo 27/09/2006, 13:13
 
Fecha de Ingreso: agosto-2006
Mensajes: 41
Antigüedad: 17 años, 8 meses
Puntos: 2
No entiendo muy bien lo que quieres hacer. Si acaso da el resultado que quieres obtener.

Pero si lo que quieres es que las líneas tengan un máximo de, por ejemplo 47 caracteres, pero que se corten cuando encuentren /&=, lo único que debes hacer es leer el array obtenido y para cada elemento cortarlo por partes de longitud 47

Albert Lanchas
  #5 (permalink)  
Antiguo 27/09/2006, 14:09
Avatar de Erikfrancisco  
Fecha de Ingreso: noviembre-2003
Ubicación: Estado de México
Mensajes: 503
Antigüedad: 20 años, 5 meses
Puntos: 4
PUES YO TAMPOCO ENTIENDO MUY BIEN TU PROBLEMA PERO AQUÍ TIENES UN CODIGO HABER SI POR LO MENOS TE DA UNA IDEA:

<?php
$url = "xxxx://xxx.wellnessbooks.com/cgi-bin/search.pl?Operation=ItemSearch&Keywords=psicogeria tria&SearchIndex =Books&templates=search";
$trozos = explode ("/", $url);
for ( $e = 0; $e < count ( $trozos ); $e++ )
{
$trozos2 = explode ( '&', $trozos[$e] );

for ( $i = 0; $i < count ( $trozos2 ); $i++ )
{
$trozos3 = explode ( '=', $trozos2[$i] );
for ( $j = 0; $j < count ( $trozos3 ); $j++ )
{
if ( count ( $trozos3) > 47 )
{
echo "Tu url no puede ser procesada ya que contiene más de 47 trozos";
}
else
{
echo $trozos3[$j]."<br/>";
}
}
}
}
?>

SUERTE
  #6 (permalink)  
Antiguo 28/09/2006, 15:00
 
Fecha de Ingreso: abril-2004
Mensajes: 19
Antigüedad: 20 años
Puntos: 0
Cita:
Iniciado por alblan Ver Mensaje
No entiendo muy bien lo que quieres hacer. Si acaso da el resultado que quieres obtener.

Pero si lo que quieres es que las líneas tengan un máximo de, por ejemplo 47 caracteres, pero que se corten cuando encuentren /&=, lo único que debes hacer es leer el array obtenido y para cada elemento cortarlo por partes de longitud 47

Albert Lanchas
Albert, como tú dices saldría algo parecido a lo que te ponía como respuesta a tu anterior post, ya que habrá muchos trozos que sean mucho menores de 47, por ejemplo, un trozo de 5 y el siguiente de 10.. esos deberían ir en el mismo trozo y aun sólo mide 15 y quizás podría unirse con el siguiente si la unión no excede de 47..

Además, para colmo, al usar split, se carga los caracteres usados como expresión con lo que no puedo volver a recomponer la cadena.. es decir, podría sacar los trozos pero no el carácter que les une..
  #7 (permalink)  
Antiguo 28/09/2006, 15:02
 
Fecha de Ingreso: abril-2004
Mensajes: 19
Antigüedad: 20 años
Puntos: 0
Cita:
Iniciado por Erikfrancisco Ver Mensaje
PUES YO TAMPOCO ENTIENDO MUY BIEN TU PROBLEMA PERO AQUÍ TIENES UN CODIGO HABER SI POR LO MENOS TE DA UNA IDEA:

<?php
.....
?>

SUERTE
Gracias Erik.

Con lo que tú propones aparece esto:
xxxx:
xxx.wellnessbooks.com
cgi-bin
search.pl?Operation
ItemSearch
Keywords
psicogeria tria
SearchIndex
Books
templates
search


Se acerca pero tengo los mismos problemas que acabo de comentarle a alblan...
  #8 (permalink)  
Antiguo 28/09/2006, 15:06
 
Fecha de Ingreso: abril-2004
Mensajes: 19
Antigüedad: 20 años
Puntos: 0
Finalmente con ayuda de vuestras propuestas he conseguido tomar el rumbo adecuado y aquí está la función resultado de mis devaneos:

<?php
print(urlWrap( "xxxx://xxx.wellnessbooks.com/cgi-bin/search.pl?Operation=ItemSearch&Keywords=psicogeria tria&SearchIndex =Books&templates=search",47));

function urlWrap($fullUrl,$lineMaxSize)
{
$chars="&?/";
$newLine="<BR>";
$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;
}


Probablemente se pueda optimizar (y de hecho os animo a ello si os apetece) pero al menos me da el resultado esperado:

xxxx://xxx.wellnessbooks.com/cgi-bin/search.pl?
Operation=ItemSearch&Keywords=psicogeriatria&
SearchIndex =Books&templates=search


Es decir, las líneas tienen un tamaño máximo de 47 o en su defecto, han sido cortadas en la máxima longitud posible o bien por un carácter '&', un carácter '?' o un carácter '/' respetando además esa prioridad.
  #9 (permalink)  
Antiguo 28/09/2006, 15:09
Avatar de Erikfrancisco  
Fecha de Ingreso: noviembre-2003
Ubicación: Estado de México
Mensajes: 503
Antigüedad: 20 años, 5 meses
Puntos: 4
Exactamente Que Es Lo Que Necesitas Para Que La Cortas Y Despues La Quieres Volver A Unir, Por Favor Se Un Poco Mas Explicito Para Que Se Te Pueda Ayudar.
  #10 (permalink)  
Antiguo 28/09/2006, 15:17
 
Fecha de Ingreso: abril-2004
Mensajes: 19
Antigüedad: 20 años
Puntos: 0
La diferencia la podéis ver aquí, en esta página(hache ttpdospuntosbarrabarra)(test).sepg.es/enlaces/enlaces.php?cat=4 hacía un wordwrap de la url para mostrarla y en esta otra: (hache ttpdospuntosbarrabarra)(www).sepg.es/enlaces/enlaces.php?cat=4 uso mi función. Aunque pueda parecer un pequeño detalle, creo que se ven mucho mejor las urls si se cortan por las / o en su defecto por &? en lugar de por cualquier palabra.

Espero que también le sea de utilidad a alguien.

Saludos y Gracias!!

Perdón por las urls, pero como no llevo 30 mensajes no me permite incluirlas..
  #11 (permalink)  
Antiguo 28/09/2006, 15:23
 
Fecha de Ingreso: abril-2004
Mensajes: 19
Antigüedad: 20 años
Puntos: 0
Hola francisco, por lo que veo me explico fatal.. O:)

Ya he encontrado la solución, es la que he puesto antes. Para que me entiendas, vé al block de notas, y escribe un texto que ocupe varias líneas.

Tienes dos opciones, si no tienes activado el 'Ajuste de Línea', el texto se mostrará en una única línea mostrando una barra de desplazamiento horizontal. Ahora activa el 'Ajuste de Línea'. La texto se muestra en varias líneas con un tamaño máximo de 80 caracteres (por ejemplo), pero prácticamente ninguna línea ocupa ese tamaño porque no se han cogido trozos exactos de 80 caracteres sino que se han dividido las líneas intentando no cortar las palabras y haciendo por tanto los cortes usando los espacios.

Yo quería hacer los mismo con una url, que no me corte ninguna palabra y que use las barras / para hacer los cortes...

¿Me he explicado mejor ahora? Espero que sí, porque ya no sé qué otros ejemplos poner

(Luego además se me ocurrió que como separador además de la /, sirvieran también los caracteres & y ?)
  #12 (permalink)  
Antiguo 28/09/2006, 15:25
 
Fecha de Ingreso: abril-2004
Mensajes: 19
Antigüedad: 20 años
Puntos: 0
Hola francisco, por lo que veo me explico fatal.. O:)

Ya he encontrado la solución, es la que he puesto antes. Para que me entiendas, vé al block de notas, y escribe un texto que ocupe varias líneas.

Tienes dos opciones, si no tienes activado el 'Ajuste de Línea', el texto se mostrará en una única línea mostrando una barra de desplazamiento horizontal. Ahora activa el 'Ajuste de Línea'. La texto se muestra en varias líneas con un tamaño máximo de 80 caracteres (por ejemplo), pero prácticamente ninguna línea ocupa ese tamaño porque no se han cogido trozos exactos de 80 caracteres sino que se han dividido las líneas intentando no cortar las palabras y haciendo por tanto los cortes usando los espacios.

Yo quería hacer los mismo con una url, que no me corte ninguna palabra y que use las barras / para hacer los cortes...

¿Me he explicado mejor ahora? Espero que sí, porque ya no sé qué otros ejemplos poner

(Luego además se me ocurrió que como separador además de la /, sirvieran también los caracteres & y ?)
  #13 (permalink)  
Antiguo 28/09/2006, 17:05
Avatar de seyacat  
Fecha de Ingreso: agosto-2006
Mensajes: 382
Antigüedad: 17 años, 8 meses
Puntos: 0
para romperse la cabeza en verdad, prueba esto
que hice
Código PHP:
<?php
function wrapurl($separador,$url,$largo){
$url str_replace("/","/\n",$url);
$url str_replace("&","\n&",$url);
$url str_replace("?","\n?",$url);
$url explode("\n",$url);
$indicea 0;
$indiceb 1;
$cadena $url[0];
$salida "";
while(
$url[$indicea]){
    
//echo sizeof($cadena)+sizeof($url[$indiceb])."<br>";
    
if(strlen($cadena)+sizeof($url[$indiceb]) > $largo or !$url[$indiceb]){

        
$salida.=$cadena."$separador";
        
$indicea $indiceb;
        
$cadena$url[$indicea];
        
$indiceb++;
        }
    else{
//echo $cadena."<br>";
        
$cadena.=$url[$indiceb];
        
$indiceb++;
        }
    }
return 
$salida;
}
echo 
wrapurl("<br>","/1/2/3/4/5/6/7/8/9/0/1/2/3/4/5/6/7/8/9/0/1/2/3/4/5/6/7/8/9/0/",5)."<br>";
echo 
wrapurl("<br>","http://images.google.com.ar/images?svnum=10&hl=es&lr=&q=perros+carnosos&btnG=B%C3%BAsqueda",10)."<br>";
echo 
wrapurl("<br>","http://images.google.com.ar/images?svnum=10&hl=es&lr=&q=perros+carnosos&btnG=B%C3%BAsqueda",30)."<br>";
echo 
wrapurl("<br>","http://images.google.com.ar/images?svnum=10&hl=es&lr=&q=perros+carnosos&btnG=B%C3%BAsqueda",50)."<br>";

?>

Última edición por seyacat; 28/09/2006 a las 17:11
  #14 (permalink)  
Antiguo 29/09/2006, 03:08
 
Fecha de Ingreso: abril-2004
Mensajes: 19
Antigüedad: 20 años
Puntos: 0
Hola seyacat:

Has entendido perfectamente mi problema pero tu código no funciona bien.

Comparo resultados:
Para tu primer echo:
/1/2/
3/4/5/
6/7/8/
9/0/1/
2/3/4/
5/6/7/
8/9/0/
1/2/3/
4/5/6/
7/8/9/
0/


Con mi programa:
/1/2/
3/4/
5/6/
7/8/
9/0/
1/2/
3/4/
5/6/
7/8/
9/0/
1/2/
3/4/
5/6/
7/8/
9/0/


El último ejemplo, con tu código:
print(wrapurl("<br>","xxxx://xxx.wellnessbooks.com/cgi-bin/search.pl?Operation=ItemSearch&Keywords=psicogeria tria&SearchIndex=Books&templates=search",47));
xxxx://xxx.wellnessbooks.com/cgi-bin/search.pl?Operation=ItemSearch
&Keywords=psicogeriatria&SearchIndex =Books&templates=search


Con el mío:
xxxx://xxx.wellnessbooks.com/cgi-bin/search.pl?
Operation=ItemSearch&Keywords=psicogeriatria&
SearchIndex =Books&templates=search


Si te fijas el principal problema de tu código es que no respeta el máximo ancho de línea, en el último ejemplo ambas líneas resultantes miden más de 47 caracteres.

Seguro que con un pequeño ajuste puede funcionar perfectamente.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:52.