<?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>Bertocq &#187; Programación</title>
	<atom:link href="http://www.bertocq.es/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bertocq.es</link>
	<description></description>
	<lastBuildDate>Tue, 25 Oct 2011 14:19:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Convertir urls a enlaces Html en Java</title>
		<link>http://www.bertocq.es/2011/10/21/convertir-urls-a-enlaces-html-en-java/</link>
		<comments>http://www.bertocq.es/2011/10/21/convertir-urls-a-enlaces-html-en-java/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 18:42:10 +0000</pubDate>
		<dc:creator>bertocq</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.bertocq.es/?p=748</guid>
		<description><![CDATA[Esta semana me he encontrado con un problema interesante en el trabajo: en una aplicación en desarrollo se usa un editor wysiwyg que no traduce de forma automática una url al código html necesario para que se convierta en un enlace. Y además tampoco se puede tocar el código javascript del editor, para no tener [...]]]></description>
			<content:encoded><![CDATA[<p>Esta semana me he encontrado con un problema interesante en el trabajo: en una aplicación en desarrollo se usa un editor <a title="editor wysiwyg" href="http://es.wikipedia.org/wiki/WYSIWYG">wysiwyg</a> que no traduce de forma automática una url al código html necesario para que se convierta en un enlace. Y además tampoco se puede tocar el código javascript del editor, para no tener problemas con la licencia de uso y distribución.</p>
<p>Así que la única solución que quedaba era traducir esas urls a html en el servicio de negocio (Java), con la problemática de tener que detectarlas y además distinguir si esas urls ya formaban parte de un código html bien formado, o si estaban repetidas.</p>
<p>Es decir que si en el editor se escribe:</p>
<pre class="brush: html; gutter: true">http://www.treelogic.com</pre>
<p>La función nos devolvería el código html para que se represente como un enlace:</p>
<pre class="brush: html; gutter: true"><a href="http://www.treelogic.com" title="Treelogic">http://www.treelogic.com</a></pre>
<p>En cambio, con el siguiente código, no debería alterar nada, pues las urls pertenecen a html bien formado:</p>
<pre class="brush: html;gutter: true">
<a href="http://www.google.es" title="google">http://www.google.es</a>
<img src="http://www.google.es/logos/classicplus.png" alt="logo google" />
</pre>
<p>Tras mucho buscar, y ver que todas las soluciones se referían sólo al problema de identificar una url en un string, encontré una gran ayuda en la <a href="http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html">documentación de la clase Pattern</a> y en concreto el apartado de <strong>Special constructs (non-capturing)</strong>, para poder ignorar las urls que ya forman parte de código html válido.</p>
<p>La función en cuestión:</p>
<pre class="brush: java; gutter: true">
	/**
	 * Finds all URLs in a given String and converts them to the html link code
	 * ignoring the urls used in existing html code.
	 *
	 * @param content
	 * @return content
	 * @author Alberto Calderón Queimadelos
	 */
	public String convertUrlsToLinks(String content) {
		Pattern URLPattern = Pattern.compile("(?&lt;!=\")(https?|ftp|file)://[-a-" +
				"zA-Z0-9+&amp;@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&amp;@#/%=~_| ](?=&lt;)(?!&lt;/a&gt;)");
		Matcher linkMatcher = URLPattern.matcher(content);
		String subString;
		while (linkMatcher.find()) {
			subString = content.substring(linkMatcher.start(),linkMatcher.end());
			content=linkMatcher.replaceFirst(" &lt;a href=\"" + subString + "\" " +
				"target=\"_blank\"&gt;" + subString + "&lt;/a&gt; ");
			linkMatcher = URLPattern.matcher(content);
		}
		return content;
	}
</pre>
<p>La expresión regular explicada:</p>
<ul>
<li><strong>(?&lt;!=\&#8221;)</strong> Se ignoran todas las urls que comiencen con un <strong>=&#8221;</strong>, para evitar todas las que se usen en un src=&#8221;", href=&#8221;", img=&#8221;", value=&#8221;", data=&#8221;" ó codebase=&#8221;"</li>
<li><strong>(https?|ftp|file)</strong> Las urls pueden comenzar por http, https, ftp o file.</li>
<li><strong>://[-a-zA-Z0-9+&amp;@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&amp;@#/%=~_| ]</strong> El patrón principal de la url.</li>
<li><strong>(?=&lt;)</strong> Si terminan en <strong>&#60;</strong> no lo cogemos como parte de la url, pues podría ser un <strong>&#60;&#47;p&#62;</strong>,<strong> &#60;br &#47;&#62;</strong>, etc&#8230;</li>
<li><strong>(?!&lt;/a&gt;)</strong> Además ignora todas las que terminen en <strong>&#60;&#47;a></strong> para evitar las que formen parte de un enlace.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bertocq.es/2011/10/21/convertir-urls-a-enlaces-html-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

