Ver Mensaje Individual
  #4 (permalink)  
Antiguo 01/03/2013, 17:47
Avatar de Adbane
Adbane
 
Fecha de Ingreso: junio-2011
Mensajes: 86
Antigüedad: 12 años, 10 meses
Puntos: 6
Respuesta: Expresión regular para enlaces magnet

Cita:
Iniciado por ryugen Ver Mensaje
De acuerdo a lo dicho, sin conocer tanto del tema, armaría la siguiente expresión regular:

Código Javascript:
Ver original
  1. magnet\:\?xt=urn\:\w+\:\w+(\&dn=[\w|\.|\-\_]+)?

Se la puede ver en funcionamiento acá (casos positivos y casos negativos):

Regex Tester
Cita:
Iniciado por emprear Ver Mensaje
@Adbane
Te diría que el formato de un magnet puede ser un poco más amplio que lo que señalas, por lo que habría que buscar una expresión más generíca
http://es.wikipedia.org/wiki/Magnet
SAludos
Hola a los dos, perdonad que no contestara antes, estuve todo el día sin internet.

A lo que ibamos. Estuve trabajando un poco y dí con una expresión regular algo engorrosa y rebuscada pero que en un principio me sirve para magnets sencillos. Pero claro, como comenta emprear, los magnets tienen formatos mucho más amplios, entre ellos hay magnets que incluyen enlaces http, lo cual hace que entre en conflicto con mi otra línea que utilizo para enlaces normales, haciendo que se mezclen magnets con url creando varios <a href>.

Código Javascript:
Ver original
  1. $('p').each(function(){
  2.     var str = $(this).html();
  3.     $(this).empty();
  4.     str = ' '+str;
  5.     str = str.replace(/((ftp|https?):\/\/([-\w\.]+)+(:\d+)?(\/([-\w/_\.]*(\?\S+)?)?)?)/gm,'<a href="$1">$1</a>');
  6.     str = str.replace(/(magnet:\?xt=urn:btih:(([\w\^\&\^;\%\=\-\.\:\/\/]*(\?\S+)?)?)?)/i,'<a href="$1">$1</a>');
  7.     str = str.replace(/([^[a-zA-Z0-9áéíóúÁÉÍÓÚüÜñÑ])\#([a-zA-Z0-9áéíóúÁÉÍÓÚüÜñÑ]+)/gm,'$1<a href="%23$2">#$2</a>');
  8.     $(this).append(str);
  9. });

Normalmente el error me lo da con magnets como este:
magnet:?xt=urn:btih:0bbfaaf5f469a2bd3d762f6942a302 f7014a35e9&tr.1=udp://tracker.ccc.de:80&tr.2=http://announce.torrentsmd.com:6969/announce&tr.3=http://announce.torrentsmd.com:8080/announce.php&tr.4=http://bttrack.9you.com/:8080/announce&tr.5=http://announce.torrentsmd.com:8080/announce&tr.6=http://bitflip.uni.cx:6969/announce&kt=http://www.bt2magnet.com

El problema ocurre cuando el each() llega hasta el primer "http", ahí termina el magnet y me genera un replace() para enlaces normales. La única solución que veo es hacerlo todo en una sola expresión regular, tanto enlaces http, como magnets, y ya de paso aquellos que empiecen por www.

Iré estudiandome un poco más a fondo las distintas estructuras que tiene un magnet, a ver si se me ocurre alguna idea...
__________________
Diseñador web por amor al arte, o al HTML mejor dicho