<?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; web</title>
	<atom:link href="http://www.tatai.es/tag/web/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>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>101 Técnicas CSS</title>
		<link>http://www.tatai.es/2008/03/30/101-tecnicas-css/</link>
		<comments>http://www.tatai.es/2008/03/30/101-tecnicas-css/#comments</comments>
		<pubDate>Sun, 30 Mar 2008 11:58:38 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.tatai.es/2008/03/30/101-tecnicas-css/</guid>
		<description><![CDATA[Voy a empezar a poner un montón de posts que se me están acumulando con el paso del tiempo y nunca termino de ponerme, jeje. Y para empezar, una recopilación de técnicas CSS de la web de noupe.com. En particular, lo que han denominado 101 CSS Techniques of all time que incluye temas como las [...]]]></description>
			<content:encoded><![CDATA[<p>Voy a empezar a poner un montón de posts que se me están acumulando con el paso del tiempo y nunca termino de ponerme, jeje.</p>
<p>Y para empezar, una recopilación de técnicas CSS de la web de <a href="http://www.noupe.com">noupe.com</a>. En particular, lo que han denominado 101 CSS Techniques of all time que incluye temas como las animaciones (sprites) CSS, esquinas redondeadas, crear menús con listas, sombreados, paginaciones, puntuaciones(star rating), pop-ups, sitemap&#8230; y un montón más.</p>
<p>Está dividido en dos partes y también es bueno revisar los comentarios ya que hay aportaciones interesantes con respecto al tema.</p>
<p>Estos son los enlaces:</p>
<ul>
<li><a href="http://www.noupe.com/design/101-css-techniques-of-all-time-part-1.html ">Parte 1</a></li>
<li><a href="http://www.noupe.com/css/101-css-techniques-of-all-time-part2.html">Parte 2</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2008/03/30/101-tecnicas-css/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

