PHP: convertir automáticamente http://* en link

Josepanaero

Hola. Quiero hacerme una función en php a la q se le pase un texto y busque las direcciones webs (o sea, las q empiecen por http://, www., etc.)y eso te lo pase a html.

Estoy peleándome con las expresiones regulares, q no sé muy bien cómo van. En un principio quiero hacer algo sencillo y luego ya le iré añadiendo cosas, pero es q de momento me lío mucho con esto y no me sale :S Lo q quiero hacer en primer lugar es q las direcciones de internet me las pase a html. Consideraré dirección de internet a toda aquella parte de la cadena que empiece por http:// y acabe en un espacio. Lo q se me ha ocurrido es esto:

$texto = eregi_replace("(http://[[:space:]]*[:space:])", "<a href=\"\0\">\0</a>", $texto);

Pero no funciona. Es decir, si pongo http://www.google.es me lo hace correctamente, pero si pongo http://www.google.com me coge sólamente http://www.google.c :O

Alguien sabe dónde está el fallo? Gracias

guner

<?php

$text = "http://www.google-lol.com/?id=4&lol=3#54";
print preg_replace(
'@((?:http|https|ftp):\/\/[\W.-]+[\w.\?#\&\=\/-]+)@',
'<a href="\1">\1</a>',
$text
);

Es infinítamente mejor usar PCRE.

La regex me la he sacado de la manga, y es muy poco restrictiva, así que puede interpretar direciones no válidas como válidas.

Josepanaero

MUCHÍSIMAS GRACIAS. Me he buscado un manual de PCRE y es mucho más sencillo de entender y a primera vista me parece mucho más potente. Incluso se me acaban de currir algunas ideas para mejorar tu función, y eso con un simple vistazo al manual. Muchas gracias, de verdad.

Edit:
Bueno, pues ya le he dado algunos retoques a la función (en realidad he hecho dos: una para q me coja los q empiezan por http, ftp, https y otra para q los q empiezan por www. los convierta en enlaces. Hasta aquí todo bien, pero ahora tb me gustaría implementar una cosilla más. Quería poner código bbcode en mi web. Entonces al implementar la negrita, el subrayado, la itálica, etc. no tengo ningún problema, pero cuando se trata de hacer enlaces del tipo:
[web=http://www.google.es]GooGLe[/web]
no me lo hace correctamente. Bueno, me explico: sí q me lo hace correctamente, pero al unir las dos funciones de autoresaltado de enlaces q mencioné anteriormente y la función de mostrar enlaces de este tipo con bbcode, me sale mal. Y aquí sí q no sé cómo meterle mano... A ver si alguien me puede ayudar a hacer q estas tres funciones puedan convivir en paz y armonía xD

// BBcode
$texto = preg_replace('@([web=([]])]([]])[\/web])@', '<a href="\2" target="_blank">\3[/b]', $texto);

// Resaltamos los enlaces
// Primero cambiamos los que empiecen por http(s):// o ftp://
$texto = preg_replace('@((?im:http|https|ftp):\/\/[.\W.-]+[\w.\?#\%\&\=\/-]+)@',
'<a href="\1" target="blank">\1</a>', $texto);
// Ahora les añadimos el http:// a los que empiecen por www. Y NO TENGAN ANTES EL HTTP(S):// o FTP://
$texto = preg_replace('@((?<!((?im:http):\/\/)|((?im:https):\/\/)|((?im:ftp):\/\/))(?im:www.)[\W.-]+[\w.\?#\%\&\=\/-]+)@',
'<a href="http://\1" target="
blank">\1</a>', $texto);

Entonces la cosa es q el autoresaltado y el bbcode funcionan bien por separado, pero al ponerlos juntos, se va todo a la mierda. Yo creo q una solución sería q cuando las funciones de autocompletado encontrasen código entre las etiquetas <a> y </a>, q lo ignorasen, pero eso no sé cómo implementarlo.

Saludos y perdón por el tochaco xD

Usuarios habituales

  • Josepanaero
  • guner