jueves, 3 de diciembre de 2009

Extraer direcciones http de un texto con expresiones regulares

He desarrollado una aplicación, que algún día pienso liberar como software libre (cuando tenga una interfaz de usuario medio decente, que permita que cualquier usuario pueda utilizarla, y no ahora que no tiene interfaz gráfica y consiste en una serie de scripts) que permite monitorizar el estado de un determinado asunto o temática, extrayendo enlaces relacionados con éste de una de las principales redes sociales: Twitter. Teneis ejemplos de posts creados automáticamente con este software aquí.

¿Cómo funciona este programa? Supongamos que montáis una página sobre juegos y apuestas. Os gustaría ofrecer a vuestros lectores información candente sobre estos: apuestas on-line, peñas virtuales, lotería, bono-loto, casas de apuestas por internet, comisiones, etc. ¿Cómo lo haríais? ¿Buscando en Google?

Desde luego es una alternativa, pero mi programa lo que trata de hacer es explotar el auge de las Redes Sociales. Cuando una persona pone un enlace en una Red Social (ya sea a través de un post en twitter o en el muro de facebook, o con un social-bookmark de Del.icio.us), es porque éste enlace le ha parecido lo suficientemente bueno como para compartirlo. Digamos que pasa una primera criba: alguien lo ha leido y lo recomienda.

El primer paso para buscar enlaces relacionados con una materia es definir una lista de tópicos y palabras clave que representen esta materia: la base de datos de conocimiento. Ahora mismo esta base de conocimiento se crea mediante un fichero de texto plano. Ahí podeis incluir los tópicos que deseais monitorizar en la Web 2.0: apuestas, lotería, juegos on-line, poker, etc.

Seguidamente, el programa busca en las redes sociales por estos términos de búsqueda, analiza el texto, extrae enlaces, y construye un post con todos los enlaces localizados en relación con éste término de búsqueda.

El proceso de generación automática de posts lo he tenido paralizado un tiempo porque la expresión regular que utilizaba para extraer enlaces del texto de los tweets estaba fallando.

La expresión regular original era esta:

http://.*?$

Esta expresión regular estaba claramente incorrecta, porque si el proceso encontraba textos como el siguiente: "Enlace interesante en http://url.org sobre cualquier tema", al tratar de extraer el enlace obtenía algo así: "http://url.org sobre cualquier tema". Es decir, detectaba el principio del enlace, pero no el final.

Lo he conseguido arreglar sustituyendo la expresión regular anterior por esta otra:

http://[^\\s]+{1,}

Entraré en más detalle sobre expresiones regulares en posts sucesivos. Lo cierto es que ahora sí funciona el proceso.

1 comentario:

  1. Qué demonios, voy a dar alguna pista sobre por qué la primera expresión regular no funcionaba. Cuando se construye una expresión regular, utilizar el patrón .*? tiene más peligro que una caja de bombas. El motor de expresiones regulares trata de extender el texto capturado al máximo, y además, no le estoy diciendo que corte cuando se encuentre un espacio en blanco.

    La expresión http://[^\\s] le dice al motor que corte cuando se encuentre un carácter en blanco (\\s), pero no tiene en cuenta que en un texto pueda haber múltiples enlaces.

    ResponderEliminar

Limpiar un Wordpress hackeado

 Check list para limpiar instancias de Wordpress que han sido hackeadas, y para prevenir hackeos. Para técnicos de sistemas con acceso SSH a...