Procurar URLs no meio do texto, em particular ligações http ou https, com expressões regulares, considerando nomes em Unicode, nomeadamente nomes de ficheiros, de domínios e de domínios de topo (TLD, top level domains). Além disso, os nomes dos TLD, que antes eram limitados a um lote pequeno e conhecido, agora nascem todas as semanas, e com tamanhos variáveis. Aparentemente, há um limite para esse tamanho, mas até quando?
Neste momento, o limite está definido nas RFC 1035, RFC 1123, e RFC 2181. Esse limite é de 63 carateres para cada segmento do nome de domínio, e 253 para o nome na totalidade, considerando já a representação textual – Punycode – no caso dos nomes que usem letras para além do ASCII ou, mais precisamente, para além do conjunto LDH (letras, dígitos, hífen), a-z, A-Z, 0-9 e o hífen.
Os URLs contêm também nomes de diretorias e de ficheiros, assim como parâmetros e variáveis para páginas dinâmicas. Construir um interpretador de URLs não é tarefa fácil. É preferível usar um já criado e testado e, eventualmente, melhorá-lo ou corrigi-lo.
Foi isso que eu fiz, e aqui fica o programa exemplo em Python com a expressão regular para caçar URLs:
#!/usr/bin/python # -*- coding: utf-8 -*- import re line = "#lol avião https://gist.github.com/HenkPoley/8899766 com o tóino a bordo test@google.co.il, person@amazon.co.uk https://www.vinicius.atongadamirongadokabuletê/fotos/pauta.gif e outro http://www.pagina.移动/index.php e mais um outro link: https:///w3.游戏/ http://w3.pt e ainda https://stat.cool/index.php " p = re.compile(r"""(?i)\b((?:https?:(?:/{1,3}|[\w0-9%])|[\w0-9.\-]+[.](?:\w{2,63})/)(?:[^\s()<>{}\[\]]+|\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\))+(?:\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])|(?:\b(?<![@.])[\w0-9]+(?:[.\-][\w0-9]+)*[.](?:\w{2,63})\b/?(?!@)))""", re.U) r = p.findall(line) print r
O resultado da interpretação é o seguinte:
['https://gist.github.com/HenkPoley/8899766', 'https://www.vinicius.atongadamirongadokabulet\xc3\xaa/fotos/pauta.gif', 'http://www.pagina.\xe7\xa7\xbb\xe5\x8a\xa8/index.php', 'https:///w3.\xe6\xb8\xb8\xe6\x88\x8f/', 'http://w3.pt', 'https://stat.cool/index.php']
Links usados para obter este resultado, por ordem cronológica:
Python regular expression again – match url
An Improved Liberal, Accurate Regex Pattern for Matching URLs
gruber/Liberal Regex Pattern for Web URLs
winzig/Liberal Regex Pattern for URLs
Domain Name System