Foros del Web » Programando para Internet » PHP »

Problema al detectar url con preg_replace

Estas en el tema de Problema al detectar url con preg_replace en el foro de PHP en Foros del Web. El código que uso es este: Código PHP: //Muchas cosas $searches [ 2 ] =  "/(^|[ \n])([a-zA-Z]+):\/\/([^ ,\"\n]+)/" ; $replaces [ 2 ] =  '\1<a href="\2://\3" target="_blank">\2://\3</a>' ; $searches [ 3 ] =  ...
  #1 (permalink)  
Antiguo 01/03/2003, 11:29
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 22 años, 2 meses
Puntos: 55
Problema al detectar url con preg_replace

El código que uso es este:
Código PHP:
//Muchas cosas
$searches[2] = "/(^|[ \n])([a-zA-Z]+):\/\/([^ ,\"\n]+)/";
$replaces[2] = '\1<a href="\2://\3" target="_blank">\2://\3</a>';
$searches[3] = "/(^|[ \n])www\.([^ ,\"\n]+)/i";
$replaces[3] = '\1<a href="http://www.\2" target="_blank">[url]www.\2[/url]</a>';
// Más cosas, hasta hacer un preg_replace 
Todo funciona bien. El problema está al detectar las url. Si la url acaba con un espacio, no hay problema, pero si acaba en otro caracter o caracteres, p. ej. un ) o ). o ), o " (así una larga lista) entonces o no hace el link o lo hace mal, incluyendo esos caracteres en la url. Asimismo, si antes de http no pongo un espacio, p. ej. (http..., tampoco me pilla el link.
¿Hay forma de detectarlas? En forosdelweb no pasa eso.
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
  #2 (permalink)  
Antiguo 01/03/2003, 11:59
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
buff expresiones regulares ..

Yo uso esta funcioncita que usa como veras un buen monton de expresiones regulares .. Tiene la misma falencia que tu método . no identifica un URL en una cadena continua.

De todas formas .. hace "clikeables" URL's y direccines de e-mail no solo http sino tambien ftp, https y ftps (estos dos últmos lo añadí yo con lo poquito q se de exp. reg xD) El tema del problema .. se que anda por .)+[a-z]{2,4} ... (el 2,4 determina la extension despues del ultimo punto para dominios de entre 2 y 4 letras para usar por ejemplo un .es .. o .name ..)

Código PHP:
<?
function html_activate_links($str) {
    
$str eregi_replace('(((f|ht){1}(tp|tps){1}://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)''<a href="\\1" target="_blank">\\1</a>'$str);
    
$str eregi_replace('([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)''\\1<a href="http://\\2" target="_blank">\\2</a>'$str);
    
$str eregi_replace('([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,4})','<a href=\"mailto:\\1\">\\1</a>'$str);
    return 
$str;
}
$str="https://www.nosedonde.tal http://usuarios.lycos.es/nose/algo.php www.nosedonde.com";
echo 
html_activate_links($str);
?>
Un saludo,

ojo: usa no convertir automaticamente URL's q sino mete el el codigo q has visto ...

Última edición por Cluster; 01/03/2003 a las 12:02
  #3 (permalink)  
Antiguo 01/03/2003, 12:06
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 22 años, 2 meses
Puntos: 55
Bueno..., la mía sí funciona para todo link, el problema es lo de la cadena continua, no las encuentra.
Sin embargo, yo en estos foros pongo (http://www.mundodivx.com) Y EL LINK SÍ FUNCIONA.

¡¡¡Administradoooooorrrrr!!! ¡¡¡Help!!! ¡¡¡Dime qué funcion usan estos foros!!!

A ver si los encuentro por ahí para verlo yo mismo
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
  #4 (permalink)  
Antiguo 01/03/2003, 13:15
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 22 años, 2 meses
Puntos: 55
Gracias a Kazaa y VBulletin

Pues nada, ya lo he conseguido con el VBulletin del Kazaa. Tranquilos, no voy a usarlo, sólo necesitaba la función.
Para los interesados:
Código PHP:
function parseurl($messagetext)
// the auto parser - adds [url] tags around neccessary things

    
$urlSearchArray = array(
      
"/([^]_a-z0-9-=\"'\/])((https?|ftp|gopher|news|telnet):\/\/|www\.)([^ \r\n\(\)\^\$!`\"'\|\[\]\{\}<>]*)/si",
      
"/^((https?|ftp|gopher|news|telnet):\/\/|www\.)([^ \r\n\(\)\^\$!`\"'\|\[\]\{\}<>]*)/si"
    
);

    
$urlReplaceArray = array(
      
"\\1[url]\\2\\4[/url]",
      
"[url]\\1\\3[/url]"
    
);

    
$emailSearchArray = array(
      
"/([ \n\r\t])([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,4}))/si",
      
"/^([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,4}))/si"
    
);

    
$emailReplaceArray = array(
      
"\\1[mail]\\2[/mail]",
      
"[mail]\\0[/mail]"
    
);

  
$text preg_replace($urlSearchArray$urlReplaceArray$messagetext);
  if (
strpos($text"@")) {
    
$text preg_replace($emailSearchArray$emailReplaceArray$text);
  }
  return 
$text;

Así añado los tag necesarios para el foro. Luego los sustituye. Con esta función da igual el carácter que haya al final, pero no así al principio. P. ej. al principio coje el ( pero no una ".
Un saludo
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
  #5 (permalink)  
Antiguo 01/03/2003, 17:24
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Se jodió el código q pasteastes al usar
X Convertir automáticamente las URLs

Please .. pastea el código pero desactiva ese checkbox cuando lo pongas .. sino veras q pone vBulletin el out por medio y monton de %%% ...

Un saludo,
  #6 (permalink)  
Antiguo 01/03/2003, 17:29
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Por cierto .. la función que puse si que funciona esto por ejemplo:

$str="(https://www.nosedonde.tal)http://usuarios.lycos.es/nose/algo.php www.nosedonde.com";

Pero No funciona por ejemplo
$str="https://www.nosedonde.talhttp://usuarios.lycos.es/nose/algo.php www.nosedonde.com";

Pruebalo y veras ..

Un saludo,
  #7 (permalink)  
Antiguo 02/03/2003, 05:01
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 22 años, 2 meses
Puntos: 55
Jejejejeje... no caí en lo de las url. Aquí va.
Código PHP:
function parseurl($messagetext)
// the auto parser - adds [url] tags around neccessary things

    
$urlSearchArray = array(
      
"/([^]_a-z0-9-=\"'\/])((https?|ftp|gopher|news|telnet):\/\/|www\.)([^ \r\n\(\)\^\$!`\"'\|\[\]\{\}<>]*)/si",
      
"/^((https?|ftp|gopher|news|telnet):\/\/|www\.)([^ \r\n\(\)\^\$!`\"'\|\[\]\{\}<>]*)/si"
    
);

    
$urlReplaceArray = array(
      
"\\1[url ]\\2\\4[/url ]",
      
"[url ]\\1\\3[/url ]"
    
);

    
$emailSearchArray = array(
      
"/([ \n\r\t])([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,4}))/si",
      
"/^([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,4}))/si"
    
);

    
$emailReplaceArray = array(
      
"\\1[mail]\\2[/mail]",
      
"[mail]\\0[/mail]"
    
);

  
$text preg_replace($urlSearchArray$urlReplaceArray$messagetext);
  if (
strpos($text"@")) {
    
$text preg_replace($emailSearchArray$emailReplaceArray$text);
  }
  return 
$text;

NOTA: he puesto un espacio donde las url, así: [url ] y [/url ] para que este foro no las detecte, luego a la hora de la verdad no hay que ponerlos. Por cierto que deshabilitando lo de convertir url no funciona.

Weno, deben ser parecidas, pues las dos cogen el paréntesis pero no la comilla.
Un saludo
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
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 12:06.