<?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>Nos pasa algo lo mismo &#187; Javascript</title>
	<atom:link href="http://www.tatai.es/category/mundo-web/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tatai.es</link>
	<description>...está claro...</description>
	<lastBuildDate>Thu, 09 Jun 2011 18:12:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>MenuMatic en capa fija (position:fixed)</title>
		<link>http://www.tatai.es/2009/11/30/menumatic-en-capa-fija-positionfixed/</link>
		<comments>http://www.tatai.es/2009/11/30/menumatic-en-capa-fija-positionfixed/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 12:35:04 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[fixed]]></category>
		<category><![CDATA[menú]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=531</guid>
		<description><![CDATA[Es posible que conozcas MenuMatic, un menú multinivel tanto horizontal como vertical realizado con Mootools 1.2. La verdad es que yo personalmente lo he usado ya varias veces y me gusta bastante la facilidad de uso y el acabado, con lo que es una de mis opciones cuando tengo que recomendar un menú. Hace poco [...]]]></description>
			<content:encoded><![CDATA[<p>Es posible que conozcas <a href="http://greengeckodesign.com/?q=menumatic">MenuMatic</a>, un menú multinivel tanto <a href="http://greengeckodesign.com/projects/menumatic/examples/horizontal/">horizontal</a> como <a href="http://greengeckodesign.com/projects/menumatic/examples/vertical/">vertical</a> realizado con Mootools 1.2. La verdad es que yo personalmente lo he usado ya varias veces y me gusta bastante la facilidad de uso y el acabado, con lo que es una de mis opciones cuando tengo que recomendar un menú.</p>
<p>Hace poco tuve un problema y es que coloqué este menú en una capa posicionada fija (position:fixed) de modo que estuviese constantemente visible aunque se realizase scroll. Claro, esto funciona en prácticamente todos los navegadores menos IE (para variar). Al hacer esto, cuando pasamos por encima del menú para realizar el desplegado, como la capa fija &#8220;evita&#8221; el scroll, el menú aparece siempre en la parte superior, de modo que si se baja por la página, el menú desaparece.</p>
<p>He hecho un par de cambios en la clase a partir de la última versión disponible, la 0.68.3. Se lo he comunicado al autor para ver si le ayuda en su próxima versión, pero de momento no he obtenido respuesta.</p>
<p>Por esta razón, dejo mi aportación aquí en el blog por si le puede servir a alguien. Las modificaciones que he realizado están bajo las líneas // Mod: Fran Naranjo. El cambio es básicamente detectar si está sobre una capa con position:fixed y si lo está, añadir el scroll a la posición en la que se muestra el menú.</p>
<ul class="botones">
<li class="descargar"><a href="/examples/js/MenuMatic_0.68.3_modified.js">Descargar mi versión modificada de MenuMatic</a></li>
<li class="demo"><a href="http://greengeckodesign.com/projects/menumatic/examples/horizontal/">Demo de MenuMatic (web del autor)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/11/30/menumatic-en-capa-fija-positionfixed/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Roller</title>
		<link>http://www.tatai.es/2009/11/28/roller/</link>
		<comments>http://www.tatai.es/2009/11/28/roller/#comments</comments>
		<pubDate>Sat, 28 Nov 2009 00:17:41 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[banner]]></category>
		<category><![CDATA[roller]]></category>
		<category><![CDATA[rotation]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=560</guid>
		<description><![CDATA[Esta semana Mario y yo, continuado con el desarrollo y evolución de OpenNUS hemos implementado un sistema de avisos en el Page Builder que llegue directamente desde los gadgets. Al final adoptamos la solución de ir mostrandolos al estilo tagline. En base a esta idea, se me ocurrió desarrollar esta pequeña y sencilla clase en [...]]]></description>
			<content:encoded><![CDATA[<p>Esta semana <a href="http://www.pensandoenred.com">Mario</a> y yo, continuado con el desarrollo y evolución de <a href="http://www.tatai.es/2009/03/12/opennus/">OpenNUS</a> hemos implementado un sistema de avisos en el Page Builder que llegue directamente desde los gadgets. Al final adoptamos la solución de ir mostrandolos al estilo tagline.</p>
<p>En base a esta idea, se me ocurrió desarrollar esta pequeña y sencilla clase en <a href="http://www.mootools.net">Mootools</a> que realice este comportamiento pero realizando el efecto de un banner rotativo o roller. De esta forma podremos mostrar por ejemplo una serie de mensajes que se irán turnando de forma constante de modo que podamos ver un cierto número a la vez.</p>
<p>Su uso es bastante sencillo. Tan sólo necesitamos un elemento padre que contenga una serie de hijos que son los que mostraremos. El caso más sencillo es tener un &lt;ul&gt; como padre y varios &lt;li&gt; como hijos.</p>
<pre><code>&lt;ul id="roller"&gt;
  &lt;li&gt;Mensaje 1&lt;/li&gt;
  &lt;li&gt;Mensaje 2&lt;/li&gt;
  &lt;li&gt;Mensaje 3&lt;/li&gt;
&lt;/ul&gt;
</code></pre>
<p>Con esta llamada, conseguiremos que se genere el Roller y comience a funcionar.</p>
<pre><code>new Roller($('roller')).startRoll();
</code></pre>
<p>Hay más ejemplos en la demo.</p>
<ul class="botones">
<li class="descargar"><a href="/examples/js/Roller.js">Descargar Roller</a></li>
<li class="demo"><a href="/mis-desarrollos/roller-banner-rotation">Demo Roller</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/11/28/roller/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SelectorGadget</title>
		<link>http://www.tatai.es/2009/10/22/selectorgadget/</link>
		<comments>http://www.tatai.es/2009/10/22/selectorgadget/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 19:30:29 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[bookmarklet]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=507</guid>
		<description><![CDATA[SelectorGadget es lo que se denomina un bookmarklet, es decir, una aplicación javascript que se llama directamente desde nuestra barra de marcadores (bookmarks). Este tipo de aplicaciones nos las encontramos en forma de enlace. Para poder usarla únicamente tenemos que arrastrar ese enlace a nuestra barra de marcadores y una vez allí, estando en la [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.selectorgadget.com/">SelectorGadget</a> es lo que se denomina un bookmarklet, es decir, una aplicación javascript que se llama directamente desde nuestra barra de marcadores (bookmarks). Este tipo de aplicaciones nos las encontramos en forma de enlace. Para poder usarla únicamente tenemos que arrastrar ese enlace a nuestra barra de marcadores y una vez allí, estando en la web en la que nos interese llamar a esta aplicación, hacemos click sobre él.</p>
<p>Ahora, tras enrollarme con la explicación de bookmarklet (que os servirá para tener esta aplicación), os cuenta que con SelectorGadget podremos encontrar fácilmente los selectores CSS para los elementos de la web que nos interesen. Este selector se muestra en formato para jQuery, pero leerlo es muy fácil y puede ayudar para los selectores de otros frameworks.</p>
<p>Podrás pinchar en distintos elementos para seleccionarlos y deseleccionarlos y así intentar obtener el selector que abarca a todos los que elijas. El vídeo de la web es bastante esclarecedor y no hay nada como probarlo.</p>
<p>No hay nada que no se pueda sacar con <a href="http://www.getfirebug.com">Firebug</a>, pero hay que decir que SelectorGadget es capaz de ahorrarnos bastante tiempo según el caso.</p>
<p>La última versión estable disponible en la web es del día 10 de Marzo de 2009. Funciona en Firefox y Safari. En IE7 no funciona del todo bien todavía.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/10/22/selectorgadget/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cuenta atrás/Countdown para mootools</title>
		<link>http://www.tatai.es/2009/10/05/cuenta-atras-countdown-para-mootools/</link>
		<comments>http://www.tatai.es/2009/10/05/cuenta-atras-countdown-para-mootools/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 20:56:39 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[cuenta atrás]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=474</guid>
		<description><![CDATA[Es posible que en la pasada Navarparty 7 participases en el concurso Date El Bit y te encontraras con que este año la primera fase de las preguntas se realizaba pregunta por pregunta y había una cuenta atrás para cada una de ellas. Pues bien, para poder hacerla realicé una pequeña clase en javascript para [...]]]></description>
			<content:encoded><![CDATA[<p>Es posible que en la pasada <a href="http://www.navarparty.org">Navarparty 7</a> participases en el concurso Date El Bit y te encontraras con que este año la primera fase de las preguntas se realizaba pregunta por pregunta y había una cuenta atrás para cada una de ellas.</p>
<div id="attachment_475" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.tatai.es/wp-content/uploads/2009/10/Navarparty7.DateElBit.png"><img class="size-medium wp-image-475" title="Navarparty7.DateElBit" src="http://www.tatai.es/wp-content/uploads/2009/10/Navarparty7.DateElBit-300x237.png" alt="Pantalla de ejemplo de Date El Bit de la Navarparty 7" width="300" height="237" /></a><p class="wp-caption-text">Pantalla de ejemplo para Date El Bit de la Navarparty 7</p></div>
<p>Pues bien, para poder hacerla realicé una pequeña clase en javascript para <a href="http://www.mootools.net">Mootools</a> que me permitiera poder visualizar la cuenta atrás que se puede ver en la imagen. Como estuve buscando por internet y no encontré nada que me gustase, me lancé a hacerlo, no podían ser muchas líneas.</p>
<p>Y así ha sido. Con tan sólo 98 líneas (incluídos comentarios en inglés), tengo el gusto de presentar la clase Countdown.</p>
<p>Esta clase tiene como objetivo realizar la cuenta atrás visualmente actualizando un elemento DOM que se le indique.</p>
<p>El ejemplo de utilización más sencillo es este, que nos crea una cuenta atrás de 10 a 0 en pasos de hasta 100 milisegundos que actualiza en el elemento con id=&#8221;counter&#8221;:</p>
<pre><code>new Countdown($('counter')).start();</code></pre>
<p>Podemos completarlo un poco más con el siguiente ejemplo:</p>
<pre><code>new Countdown($('counter'), {
  'decimals' : '3', // para hacer que parezca un tiempo de la fórmula 1 :p
  'onComplete' : function() {alert('finalizado!');}, // muestra un alert cuando acaba la cuenta atrás
  'onStep' : function(target, show) {
    // Si el contador está por debajo de 5, poner en rojo, si no, en negro
    if(show &lt; 5) {
      target.setStyle('color', '#f00');
    }
    else {
      target.setStyle('color', '#000');
    }
  }
});</code></pre>
<ul class="botones">
<li class="descargar"><a href="/examples/js/Countdown.js">Descargar Countdown</a></li>
<li class="demo"><a href="/mis-desarrollos/countdown">Demo Countdown</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/10/05/cuenta-atras-countdown-para-mootools/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TestSwarm. Integración contínua distribuida en Javascript</title>
		<link>http://www.tatai.es/2009/08/26/testswarm-integracion-continua-distribuida-en-javascript/</link>
		<comments>http://www.tatai.es/2009/08/26/testswarm-integracion-continua-distribuida-en-javascript/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 17:54:38 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[integración contínua]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[TestSwarm]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=459</guid>
		<description><![CDATA[Acabo de leer el post de John Resig sobre TestSwarm, un nuevo proyecto, todavía en fase alpha de Mozilla Corporation, que permite realizar test de código Javascript en diversos navegadores y varias plataformas de forma distribuida. Esto quiere decir que cuando se pone un script a evaluar en esta plataforma, se ejecuta en varios navegadores [...]]]></description>
			<content:encoded><![CDATA[<p>Acabo de leer el <a href="http://ejohn.org/blog/test-swarm-alpha-open/">post de John Resig</a> sobre <a href="http://testswarm.com">TestSwarm</a>, un nuevo proyecto, todavía en fase alpha de Mozilla Corporation, que permite realizar test de código Javascript en diversos navegadores y varias plataformas de forma distribuida. Esto quiere decir que cuando se pone un script a evaluar en esta plataforma, se ejecuta en varios navegadores a la vez, permitiendo extraer posteriormente los resultados.</p>
<p>El siguiente dibujo extraído de la web de John Resig se muestra la arquitectura:</p>
<div id="attachment_462" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.tatai.es/wp-content/uploads/2009/08/ts-swarm.png"><img class="size-medium wp-image-462" title="Arquitectura TestSwarm" src="http://www.tatai.es/wp-content/uploads/2009/08/ts-swarm-300x225.png" alt="Arquitectura de TestSwarm" width="300" height="225" /></a><p class="wp-caption-text">Arquitectura de TestSwarm</p></div>
<p>El video la verdad es que impresiona. En él se puede ver cómo ejecuta un test y, poco a poco, van apareciendo resultados.</p>
<p style="text-align: center;"><p><a href="http://www.tatai.es/2009/08/26/testswarm-integracion-continua-distribuida-en-javascript/"><em>Pinche aquí para ver el vídeo</em></a></p></p>
<p>Hay que seguir este proyecto de cerca. Las posibilidades que puede darnos a la hora de realizar integración contínua en nuestros proyectos también en javascript (sólo jQuery, al menos en lo que se ve de momento), es enorme. Muy muy muy interesante.</p>
<p><a href="http://ejohn.org/blog">John Resig</a> es conocido por ser Javascript Evangelist en Mozilla Corporation aunque actualmente está en el equipos Javascript Tool Developer. Es conocido también por participar como desarrollador en el proyecto One Laptor Per Child.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/08/26/testswarm-integracion-continua-distribuida-en-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mis expresiones regulares favoritas</title>
		<link>http://www.tatai.es/2009/08/22/mis-expresiones-regulares-favoritas/</link>
		<comments>http://www.tatai.es/2009/08/22/mis-expresiones-regulares-favoritas/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 20:08:34 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[expresiones regulares]]></category>
		<category><![CDATA[regexp]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=451</guid>
		<description><![CDATA[A raíz de mi post anterior sobre 5 expresiones regulares que todo programador web debería conocer, me ha parecido interesante añadir unas cuantas más que, aunque quizás no sean nada del otro mundo, me parecen muy útiles y seguro que ayudan a más de uno. Validar un número entero Esta es realmente sencilla y muy [...]]]></description>
			<content:encoded><![CDATA[<p>A raíz de mi post anterior sobre <a href="http://www.tatai.es/2009/08/22/5-expresiones-regulares-que-todo-programador-web-deberia-conocer/">5 expresiones regulares que todo programador web debería conocer</a>, me ha parecido interesante añadir unas cuantas más que, aunque quizás no sean nada del otro mundo, me parecen muy útiles y seguro que ayudan a más de uno.</p>
<h3>Validar un número entero</h3>
<p>Esta es realmente sencilla y muy muy útil, sobre todo si trabajar con cadenas de texto o lenguajes de programación no tipados. En PHP hay por ejemplo funciones como <a href="http://www.php.net/is_number">is_number()</a> que hacen una función parecida.</p>
<p>Comprueba si todos caracteres del string son dígitos.</p>
<pre><code>/^\d+$/</code></pre>
<p>O, de forma equivalente:</p>
<pre><code>/^[0-9]+$/</code></pre>
<p>Atentos que la cadena vacía no pasa esta expresión, es necesario que haya al menos un dígito. Si quieres permitir que esté vacío, entonces cambia el + por *.</p>
<h3>Validar un número decimal</h3>
<p>Esta es una extensión la anterior. Acepta tanto número positivos como negativos y que el separador de decimales sea coma o punto:</p>
<pre><code>/^-?[0-9]+([,\.][0-9]*)?$/</code></pre>
<h3>Validar opciones de entrada</h3>
<p>Aunque no siempre, viene muy bien cuando tenemos unos cuantos parámetros y no queremos usar if($a == &#8216;a&#8217; || $a == &#8216;b&#8217; || $a == &#8216;c&#8217;) y todo lo largo que queráis el if.</p>
<p>La siguiente expresión comprueba si la variable es a,  b, c, otro o mas:</p>
<pre><code>/^(a|b|c|otro|mas)$/</code></pre>
<p>En PHP, con un preg_match, la papeleta está solucionada. Por ejemplo:</p>
<pre><code>if(!preg_match('/^(a|b|c|otro|mas)$/', $a) {
  // Si entra es que no hay coincidencias
  return null;
}</code></pre>
<p>Tras estas líneas, $a es sólo una de las opciones indicada y si no, habrá retornado null.</p>
<h3>Extraer cierta parte de un texto</h3>
<p>Partiendo de que tenemos una cadena de caracteres en $text y sabemos que en alguna parte suya cumple que tiene una cadena de texto (por ejemplo &#8216;jugador&#8217;) y un número separados por un guión (es decir, por ejemplo &#8216;jugador-15&#8242;) y queremos conocer ese número porque es su identificador. Podemos usar:</p>
<pre><code>preg_match('/player-(\d+)/', $text, $matches);
$id = $matches[1];</code></pre>
<p>Tras estas líneas, en $id tenemos nuestro número.</p>
<p>Esta expresión se puede extender todavía un poco más si el texto a buscar lo tenemos en una variable, por ejemplo $buscar.</p>
<p>En PHP podemos hacer:</p>
<pre><code>preg_match('/' . $buscar . '-(\d+)/', $text, $matches);
$id = $matches[1];</code></pre>
<p>Si estás usando javascript, el equivalente para este último caso es:</p>
<pre><code>var buscar = 'player';
var m = texto.match(new RegExp(buscar + '-(\d+)'));
var id = m[1];</code></pre>
<p>Y hasta aquí da mi memoria de momento. Cuando me acuerde de alguna otra, ya las iremos posteando.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/08/22/mis-expresiones-regulares-favoritas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>5 expresiones regulares que todo programador web debería conocer</title>
		<link>http://www.tatai.es/2009/08/22/5-expresiones-regulares-que-todo-programador-web-deberia-conocer/</link>
		<comments>http://www.tatai.es/2009/08/22/5-expresiones-regulares-que-todo-programador-web-deberia-conocer/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 14:20:14 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[expresiones regulares]]></category>
		<category><![CDATA[regexp]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=446</guid>
		<description><![CDATA[Extraigo de I&#8217;m Mike un artículo bastante interesante 5 expresiones regulares (también llamadas regexp) que deberías conocer si eres programador web. Bien es sabido por los que me conocen que considero las expresiones regulares como uno de los mejores método que se han inventado para los programadores (y en general, para cualquier persona que quiera [...]]]></description>
			<content:encoded><![CDATA[<p>Extraigo de <a href="http://immike.net/blog/2007/04/06/5-regular-expressions-every-web-programmer-should-know/">I&#8217;m Mike</a> un artículo bastante interesante 5 expresiones regulares (también llamadas regexp) que deberías conocer si eres programador web.</p>
<p>Bien es sabido por los que me conocen que considero las <a href="http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular">expresiones regulares</a> como uno de los mejores método que se han inventado para los programadores (y en general, para cualquier persona que quiera comprobar si una cadena de caracteres cumple ciertas características y posibilidades). Como definió <a href="http://www.twi/acidonitrix">@acidonitrix</a> en su momento: en todas las empresas hay algún loco que le encantan las expresiones regulares; pues bien, ¡ese es mi caso! (Ya me lo haré mirar algún día, pero de momento no molesta)</p>
<p>Pues bien, las 5 expresiones que Mike comenta son las siguientes</p>
<h3>Comprobar un nombre de usuario</h3>
<p>Esta es la más sencilla de todas. Comprueba si el nombre de usuario está compuesto únicamente por letras, mayúsculas o minúsculas, números de 0 a 9 o el guión bajo (<em>underscore</em>) y cuya longitud total sea entre 3 y 16 caracteres.</p>
<pre><code>/^[a-zA-Z0-9_]{3,16}$/</code></pre>
<h3>Buscar una etiqueta HTML/XHTML</h3>
<p>Partiendo del ejemplo de querer buscar la etiqueta <em>tag</em> aquí coincido con Mike en que la mejor forma (de las varias y farragosas que existen) es usar lo que se denomina un &#8220;cuantificador vago&#8221; (<em>lazy quantifier</em>) para obtener todo el contenido de la etiqueta.</p>
<pre><code>/&lt;tag[^&gt;]*&gt;(.*?)&lt;\/tag&gt;/</code></pre>
<p>Existen otras soluciones, pero ninguna tan directa como esta. Podríamos buscar el contenido por [^&gt;]*, pero eso nos obligaría a post-procesar el resultado ya que es posible que dentro de esa etiqueta tengamos otra.</p>
<h3>Buscar una etiqueta HTML/XHTML con cierto atributo y valor en su interior</h3>
<p>Esta expresión es algo más compleja y usa las referencias (<em>matching backreference</em>) que son los \\1 y \\2 para buscar el tag y la comilla o las dobles comillas que cierran el valor del atributo. Este truco también se podía haber usado antes, pero yo creo que queda más claro así.</p>
<p>Para este ejemplo, supongamos que se quiere buscar la etiqueta <em>tag</em>, el atributo <em>attribute</em> y el valor <em>value</em>:</p>
<pre><code>/&lt;tag[^&gt;]*attribute\s*=\s*(["'])value\\2[^&gt;]*&gt;(.*?)&lt;\/\\1&gt;/</code></pre>
<p>Cuando incluyáis esta regexp en PHP, tened cuidado en escapar una de las dos, según el carácter que uséis para crear la cadena de texto. Por ejemplo:</p>
<pre><code>preg_match('/&lt;tag[^&gt;]*attribute\s*=\s*(["\'])value\\2[^&gt;]*&gt;(.*?)&lt;\/\\1&gt;/', $text, $matches)</code></pre>
<p>Tengo que reconocer que esta expresión como esta no la he usado apenas. Las veces que he tenido que buscar algún atributo, solía ser más de uno o más complejo que una simple asignación y, partiendo del ejemplo anterior, el de buscar una etiqueta HTML/XHTML, procesaba el resultado.</p>
<h3>Comprobar una dirección de correo electrónico</h3>
<p>Esto ya son palabras mayores. La solución que se plantea, dada por <a href="http://www.iamcal.com/">Cal Henderson</a>, cumple con la <acronym title="Request For Comments">RFC</acronym> 822 que define cómo son las direcciones de correo electrónico. Poco más se puede añadir, no hay nada más completo:</p>
<pre><code>function is_valid_email_address($email){
  $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
  $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
  $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c'.
                  '\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
  $quoted_pair = '\\x5c[\\x00-\\x7f]';
  $domain_literal = "\\x5b($dtext|$quoted_pair)*\\x5d";
  $quoted_string = "\\x22($qtext|$quoted_pair)*\\x22";
  $domain_ref = $atom;
  $sub_domain = "($domain_ref|$domain_literal)";
  $word = "($atom|$quoted_string)";
  $domain = "$sub_domain(\\x2e$sub_domain)*";
  $local_part = "$word(\\x2e$word)*";
  $addr_spec = "$local_part\\x40$domain";

  return preg_match("!^$addr_spec$!", $email) ? 1 : 0;
}</code></pre>
<h3>Comprabando una URL</h3>
<p>En mi sincera opinión, crear una regla genérica para comprobar una URL es un berenjenal horrible. Hace falta realizar alguna particularización. Seguidamente os pongo el código de I&#8217;m Mike.</p>
<pre><code>{
  \\b
  # Match the leading part (proto://hostname, or just hostname)
  (
    # http://, or https:// leading part
    (https?)://[-\\w]+(\\.\\w[-\\w]*)+
  |
    # or, try to find a hostname with more specific sub-expression
    (?i: [a-z0-9] (?:[-a-z0-9]*[a-z0-9])? \\. )+ # sub domains
    # Now ending .com, etc. For these, require lowercase
    (?-i: com\\b
        | edu\\b
        | biz\\b
        | gov\\b
        | in(?:t|fo)\\b # .int or .info
        | mil\\b
        | net\\b
        | org\\b
        | [a-z][a-z]\\.[a-z][a-z]\\b # two-letter country code
    )
  )

  # Allow an optional port number
  ( : \\d+ )?

  # The rest of the URL is optional, and begins with /
  (
    /
    # The rest are heuristics for what seems to work well
    [^.!,?;"\\'&lt;&gt;()\[\]\{\}\s\x7F-\\xFF]*
    (
      [.!,?]+ [^.!,?;"\\'&lt;&gt;()\\[\\]\{\\}\s\\x7F-\\xFF]+
    )*
  )?
}ix</code></pre>
<p>Como se puede comprobar es realmente una tarea complicada y, aunque esta regexp funciona bastante bien para la amplia mayoría de casos, hay <acronym title="Top Level Domain - Dominios del nivel más alto">TLD</acronym> que se deja como por ejemplo .name, .travel, etc.</p>
<p>Y de momento dejo el post aquí, ya que tengo en marcha otro sobre expresiones regulares que llegará en breve.</p>
<p>Update: ya tengo mi propio post sobre <a href="http://www.tatai.es/2009/08/22/mis-expresiones-regulares-favoritas/">expresiones regulares</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/08/22/5-expresiones-regulares-que-todo-programador-web-deberia-conocer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Migrar fácilmente el selector dolar a document.id (mootools 1.2.3)</title>
		<link>http://www.tatai.es/2009/06/21/migrar-facilmente-el-selector-dolar-a-documentid-mootools-123/</link>
		<comments>http://www.tatai.es/2009/06/21/migrar-facilmente-el-selector-dolar-a-documentid-mootools-123/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 11:30:34 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[command line]]></category>
		<category><![CDATA[migrate]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=418</guid>
		<description><![CDATA[Voy a contar un par de sencillos comandos que os ayudarán si queréis migrar todos vuestros selectores dolar ($) a la nueva forma definida en mootools 1.2.3: document.id. La primera forma es ejecutar un comando desde la línea de comandos. Todo lo que necesitas es tener instalado perl en tu sistema. Este es el comando [...]]]></description>
			<content:encoded><![CDATA[<p>Voy a contar un par de sencillos comandos que os ayudarán si queréis migrar todos vuestros selectores dolar ($) a la nueva forma definida en mootools 1.2.3: document.id.</p>
<p>La primera forma es ejecutar un comando desde la línea de comandos. Todo lo que necesitas es tener instalado <em>perl</em> en tu sistema. Este es el comando (cambia <em>fichero.js</em> por el nombre de tu fichero javascript):</p>
<pre><code>perl -i -pe 's/([^\$])\$\(/$1document.id(/g;' fichero.js</code></pre>
<p>Quizás prefieras usar <em>-i.old</em> en vez de <em>-i</em> que hará una copia de tu fichero original <em>fichero.js</em> a <em>fichero.js.old</em>. De esta forma, mantienes una copia de tu fichero original.</p>
<p>Por supuesto este comando se puede usar con otros como <em>find</em> de modo que puedas migrar más de un fichero a la vez:</p>
<pre><code>for i in $( find /path/a/tu/directorio/js -iname '*.js' ); do perl -i -pe 's/([^\$])\$\(/$1document.id(/g;' $i; done</code></pre>
<p>Finalmente, para todos aquellos que como yo usen y prefieran vim, voy a mostrar como se hace el cambio con vim. Asegúrate que estas en el <em>modo-comando</em> (presiona varias veces la tecla <em>&lt;Esc&gt;</em>) y escribe:</p>
<pre><code>:%s/\([^\$]\)\$(/\=submatch(1) . "document.id("/g</code></pre>
<p>Y eso es todo! Disfruta de tu nuevo código que cumple con la especificación de compatibilidad entre frameworks javascript.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/06/21/migrar-facilmente-el-selector-dolar-a-documentid-mootools-123/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Easy migrating dolar selector to document.id (mootools 1.2.3)</title>
		<link>http://www.tatai.es/2009/06/21/easy-migrating-dolar-selector-to-documentid-mootools-123/</link>
		<comments>http://www.tatai.es/2009/06/21/easy-migrating-dolar-selector-to-documentid-mootools-123/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 11:20:26 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[command line]]></category>
		<category><![CDATA[migrate]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=415</guid>
		<description><![CDATA[I would like to show you a pair of easy command that will help you if you want to change all your dolar selectors ($) to the new defined document.id in mootools 1.2.3. The first way can be executed from command line. All you need is having perl on your system. This is the command [...]]]></description>
			<content:encoded><![CDATA[<p>I would like to show you a pair of easy command that will help you if you want to change all your dolar selectors ($) to the new defined document.id in mootools 1.2.3.</p>
<p>The first way can be executed from command line. All you need is having perl on your system. This is the command (change <em>your_file.js</em> to the filename that fits your needs):</p>
<pre><code>perl -i -pe 's/([^\$])\$\(/$1document.id(/g;' your_file.js</code></pre>
<p>Perhaps you will prefer to use <em>-i.old</em> instead <em>-i</em> that will copy your original file <em>your_file.js</em> to <em>your_file.js.old</em>. In this way, you get a backup of your original file.</p>
<p>Of course, this command can be used with others like <em>find</em> so you can migrate more files at once:</p>
<pre><code>for i in $( find /path/to/your/js/files -iname '*.js' ); do perl -i -pe 's/([^\$])\$\(/$1document.id(/g;' $i; done</code></pre>
<p>Finally, for those vim lovers like me, I would like to show you how to make this change inside vim. In <em>command-mode</em> (press <em>&lt;Esc&gt;</em> a pair of times) write:</p>
<pre><code>:%s/\([^\$]\)\$(/\=submatch(1) . "document.id("/g</code></pre>
<p>And that&#8217;s all! Enjoy your new brand cross-framework compliant code.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/06/21/easy-migrating-dolar-selector-to-documentid-mootools-123/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Teclas rápidas usando mootools</title>
		<link>http://www.tatai.es/2009/06/20/teclas-rapidas-usando-mootools/</link>
		<comments>http://www.tatai.es/2009/06/20/teclas-rapidas-usando-mootools/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 11:11:01 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[shortcuts]]></category>
		<category><![CDATA[teclas rápidas]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=411</guid>
		<description><![CDATA[Hace unos días me plantee la posibilidad de añadir teclas rápidas al funcionamiento de la aplicación. Las teclas rápidas o también llamadas atajos de teclado (o &#8220;keyboard shortcuts&#8221; en inglés) nos permite realizar acciones pulsando una tecla o una combinación de teclas. Por ejemplo, habremos usado muchas veces Ctrl + g (o la variante inglés [...]]]></description>
			<content:encoded><![CDATA[<p>Hace unos días me plantee la posibilidad de añadir teclas rápidas al funcionamiento de la aplicación. Las teclas rápidas o también llamadas atajos de teclado (o &#8220;keyboard shortcuts&#8221; en inglés) nos permite realizar acciones pulsando una tecla o una combinación de teclas. Por ejemplo, habremos usado muchas veces Ctrl + g (o la variante inglés Ctrl + s) para grabar un documento, Ctrl + r para recargar la pantalla de nuestro navegador o, por ejemplo, todas <a href="http://mail.google.com/support/bin/answer.py?hl=en&amp;answer=6594">las teclas rápidas de GMail</a>. Lo que voy a explicar brevemente en este post es como conseguir algo parecido a lo que usa GMail.</p>
<p>El funcionamiento es realmente sencillo, este sería el código:</p>
<pre><code>document.addEvent('keyup', function(e) {
    var bg = e.target.get('tag');
    if(bg == 'html' || bg == 'body') {
        if(e.key == 'a') {
            accion1();
        }
        else if(e.key == 's') {
            accion2();
        }
    }
});
</code></pre>
<p>Lo único que le falta a este código son las funciones accion1() y accion2() que son las que se ejecutarán cuando pulsemos las teclas a y s respectivamente.</p>
<p>Este código añade un evento &#8216;keyup&#8217;, es decir, cuando se detecta que se ha pulsado una tecla y estamos levantando el dedo de la tecla. Este evento indaga a ver qué tecla se ha pulsado y en caso de ser una de las de la lista, ejecutará la función correspondiente.</p>
<p>La comprobación de que el objetivo de nuestra pulsación (e.target) sea &#8216;html&#8217; o &#8216;body&#8217; sirve para que no se haga esta comprobación cuando estamos en un elemento como un input, un textarea, etc. Es decir, tenemos que tener el foco en el documento. En la mayoría de los navegadores funcionaría simplemente con indicar &#8216;html&#8217;, pero, como siempre, Internet Explorer tiene que dar la nota y necesita que comprobemos sobre &#8216;body&#8217;.</p>
<p>Por último añadir que podemos obtener más información del evento:</p>
<pre><code>e.code: el código de la tecla pulsada
e.control: true si la tecla Ctrl está pulsada
e.shift: true si la tecla Shift está pulsada
e.alt: true si la tecla Alt está pulsada
</code></pre>
<p>Y no sólo esto, también podemos trabajar con la rueda del ratón o el botón derecho del ratón</p>
<p>El resultado es realmente espectacular si tienes que trabajar con una aplicación en la que las teclas rápidas te hacen la vida más sencilla <img src='http://www.tatai.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/06/20/teclas-rapidas-usando-mootools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

