Links clicables en texto libre

A menudo facilitamos al usuario de formularios algún cuadro de texto libre que permiten la inclusión de enlaces web. Se me ocurren sólo tres formas de conseguir que esos enlaces sean clicables al volver a volcar la info en pantalla:

  1. Dejarlo en manos del usuario, confiando en que use correctamente los tags <a href=”…”></a>
  2. Dejarlo en manos del usuario, confiando en que use correctamente alguna herramienta web que le facilitemos para ello, como FCKEditor, TinyMCE o similares
  3. Dejarlo en manos de una función.

Dejar el HTML en manos del usuario medio es habitualmente una fuente de problemas, así que suelo prescindir de la opción 1.

La opción 2 es muy tentadora pero sólo la utilizo cuando desarrollo paneles de control ya que sus usuarios tienen formación específica o han recibido algún cursillo, así que todo suele ir como la seda.

Así que cuando se trata de dejar formularios al alcance de usuarios desconocidos, me decanto siempre por la opción 3.

Ejemplo: Supongamos que el siguiente texto es introducido en un textarea de un formulario web.

Hola Juan. La web de Cuatro es http://www.cuatro.com, la de Antena 3 es http://antena3.com, la de RTVE es http://rtve..es y la de La Sexta creo que es www.lasexta.com. A ver si ahí puedes encontrar la info que buscas. Un saludo.

Vemos que el mensaje incluye cuatro enlaces:

  • http://www.cuatro.com es correcto.
  • http://antena3.com es correcto aunque no incluya el subdominio ‘www’.
  • http://rtve..es presenta una errata (dos puntos entre ‘rtve’ y ‘es’) y no es un enlace válido.
  • www.lasexta.com sería correcto en la barra de direcciones del navegador pero en principio no es directamente reconocible como enlace al no ir precedido del indicador de protocolo ‘http://’.

La función que presento hoy es capaz de reconocer los enlaces y actuar en consecuencia:

<?php
function addLinks($str,$alt=false)
	{
	$com = "[enlace]";
	$pcl = "((ht|f)tps?:\/\/)";
	$hst = "([a-z\d][-a-z\d]*[a-z\d]\.)+".
		   "[a-z][-a-z\d]*[a-z]";
	$prt = "(:\d{1,})?";
	$pth = "(\/[^?<>\#\"\s]+)?";
	$qry = "(\?[^<>\#\"\s]+)?";
	$str = preg_replace(
			"#({$pcl}{$hst}{$prt}{$pth}{$qry})#",
			"<a href='$1'>".($alt?$com:'$1').
			"</a>",$str);
	$str = preg_replace(
			"#\s(www.{$hst}{$prt}{$pth}{$qry})#",
			" <a href='http://$1'>".($alt?$com:'$1').
			"</a>",$str);
	return $str;
	}

$txt = "Hola Juan. La web de Cuatro es http://www.cuatro.com, ".
	   "la de Antena 3 es http://antena3.com, la de RTVE es ".
	   "http://rtve..es y la de La Sexta creo que es ".
	   "www.lasexta.com. A ver si ahí puedes encontrar la info ".
	   "que buscas. Un saludo.";

echo addLinks($txt);
?>

Esta función devuelve el valor de $txt como sigue:

Hola Juan. La web de Cuatro es http://www.cuatro.com, la de Antena 3 es http://antena3.com, la de RTVE es http://rtve..es y la de La Sexta creo que es www.lasexta.com. A ver si ahí puedes encontrar la info que buscas. Un saludo.

Vemos que los tres enlaces válidos son clicables. El enlace a RTVE no lo es porque la función no lo dio por bueno. Pero aparece como parte del texto con la esperanza de que quien lo lea detecte la errata, corrija el enlace y pueda utilizarlo.

¡Ah! Y si queremos que no aparezcan los enlaces escritos (a veces ocupan demasiado espacio), podemos sustituirlos por una palabra comodín simplemente añadiendo ‘true’ como segundo parámetro:

<?= addLinks($txt,true); ?>

Lo que nos devuelve:

Hola Juan. La web de Cuatro es [enlace], la de Antena 3 es [enlace], la de RTVE es http://rtve..es y la de La Sexta creo que es [enlace]. A ver si ahí puedes encontrar la info que buscas. Un saludo.

Muy práctico, ¿verdad?.


Acerca de esta entrada

Libros en Amazon.es:
Sobre informática | Sobre PHP | Sobre CSS | Sobre javaScript