<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Quenerapú &#187; expresiones regulares</title>
	<atom:link href="http://quenerapu.com/etiquetas/expresiones-regulares/feed/" rel="self" type="application/rss+xml" />
	<link>http://quenerapu.com</link>
	<description>Sentado delante de un ordenador desde 1982. ¿De qué voy a hablar, si no?</description>
	<lastBuildDate>Mon, 02 Aug 2010 14:22:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Links clicables en texto libre</title>
		<link>http://quenerapu.com/javascript/links-clicables-en-texto-libre/</link>
		<comments>http://quenerapu.com/javascript/links-clicables-en-texto-libre/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 17:22:34 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[javaScript]]></category>
		<category><![CDATA[expresiones regulares]]></category>
		<category><![CDATA[función]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=67</guid>
		<description><![CDATA[Una cómoda función que automatiza el código necesario para hacer clicables los enlaces web contenidos en cualquier cadena de texto.]]></description>
			<content:encoded><![CDATA[<p>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:</p>
<ol>
<li>Dejarlo en manos del usuario, confiando en que use correctamente los tags <strong>&lt;a href=&#8221;&#8230;&#8221;&gt;&lt;/a&gt;</strong></li>
<li>Dejarlo en manos del usuario, confiando en que use correctamente alguna herramienta web que le facilitemos para ello, como <a href="http://www.fckeditor.net/">FCKEditor</a>, <a href="http://tinymce.moxiecode.com/">TinyMCE</a> o similares</li>
<li>Dejarlo en manos de una función.</li>
</ol>
<p>Dejar el HTML en manos del usuario medio es habitualmente una fuente de problemas, así que suelo prescindir de la <strong>opción 1</strong>.</p>
<p>La <strong>opción 2</strong> 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.</p>
<p>Así que cuando se trata de dejar formularios al alcance de usuarios desconocidos, me decanto siempre por la <strong>opción 3</strong>.</p>
<p>Ejemplo: Supongamos que el siguiente texto es introducido en un textarea de un formulario web.</p>
<div class="cita">
<p>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.</p>
</div>
<p>Vemos que el mensaje incluye cuatro enlaces:</p>
<ul>
<li><strong>http://www.cuatro.com</strong> es correcto.</li>
<li><strong>http://antena3.com</strong> es correcto aunque no incluya el subdominio &#8216;www&#8217;.</li>
<li><strong>http://rtve..es</strong> presenta una errata (dos puntos entre &#8216;rtve&#8217; y &#8216;es&#8217;) y no es un enlace válido.</li>
<li><strong>www.lasexta.com</strong> 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 &#8216;http://&#8217;.</li>
</ul>
<p>La función que presento hoy es capaz de reconocer los enlaces y actuar en consecuencia:</p>
<pre class="brush: php;">
&lt;?php
function addLinks($str,$alt=false)
	{
	$com = &quot;[enlace]&quot;;
	$pcl = &quot;((ht|f)tps?:\/\/)&quot;;
	$hst = &quot;([a-z\d][-a-z\d]*[a-z\d]\.)+&quot;.
		   &quot;[a-z][-a-z\d]*[a-z]&quot;;
	$prt = &quot;(:\d{1,})?&quot;;
	$pth = &quot;(\/[^?&lt;&gt;\#\&quot;\s]+)?&quot;;
	$qry = &quot;(\?[^&lt;&gt;\#\&quot;\s]+)?&quot;;
	$str = preg_replace(
			&quot;#({$pcl}{$hst}{$prt}{$pth}{$qry})#&quot;,
			&quot;&lt;a href='$1'&gt;&quot;.($alt?$com:'$1').
			&quot;&lt;/a&gt;&quot;,$str);
	$str = preg_replace(
			&quot;#\s(www.{$hst}{$prt}{$pth}{$qry})#&quot;,
			&quot; &lt;a href='http://$1'&gt;&quot;.($alt?$com:'$1').
			&quot;&lt;/a&gt;&quot;,$str);
	return $str;
	}

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

echo addLinks($txt);
?&gt;
</pre>
<p>Esta función devuelve el valor de <strong>$txt</strong> como sigue:</p>
<div class="cita">
<p>Hola Juan. La web de Cuatro es <a href="http://www.cuatro.com">http://www.cuatro.com</a>, la de Antena 3 es <a href="http://antena3.com">http://antena3.com</a>, la de RTVE es http://rtve..es y la de La Sexta creo que es <a href="http://www.lasexta.com">www.lasexta.com</a>. A ver si ahí puedes encontrar la info que buscas. Un saludo.</p>
</div>
<p>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.</p>
<p>¡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 &#8216;true&#8217; como segundo parámetro:</p>
<pre class="brush: php; gutter: false;">
&lt;?= addLinks($txt,true); ?&gt;
</pre>
<p>Lo que nos devuelve:</p>
<div class="cita">
<p>Hola Juan. La web de Cuatro es <a href="http://www.cuatro.com">[enlace]</a>, la de Antena 3 es <a href="http://antena3.com">[enlace]</a>, la de RTVE es http://rtve..es y la de La Sexta creo que es <a href="http://www.lasexta.com">[enlace]</a>. A ver si ahí puedes encontrar la info que buscas. Un saludo.</p>
</div>
<p>Muy práctico, ¿verdad?.</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/javascript/links-clicables-en-texto-libre/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
