Mantenha simples! Diga o que você não pode ter, em vez do que você pode ter :)
Como mencionado acima, os URLs podem ser bastante complexos, especialmente após o '?', E nem todos começam com um 'www'. por exemplomaps.bing.com/something?key=!"£$%^*()&lat=65&lon&lon=20
Portanto, em vez de ter uma regex complexa que não atenda a todos os casos extremos e será difícil de manter, que tal essa mais simples, que funciona bem para mim na prática.
Combine
http(s):// (anything but a space)+
www. (anything but a space)+
Onde "qualquer coisa" é [^'"<>\s]
... basicamente uma combinação gananciosa, levando você a encontrar um espaço, cotação, colchete angular ou fim de linha
Além disso:
Lembre-se de verificar se ele ainda não está no formato de URL, por exemplo, o texto contém href="..."
ousrc="..."
Adicione ref = nofollow (se apropriado)
Essa solução não é tão "boa" quanto as bibliotecas mencionadas acima, mas é muito mais simples e funciona bem na prática.
if html.match( /(href)|(src)/i )) {
return html; // text already has a hyper link in it
}
html = html.replace(
/\b(https?:\/\/[^\s\(\)\'\"\<\>]+)/ig,
"<a ref='nofollow' href='$1'>$1</a>"
);
html = html.replace(
/\s(www\.[^\s\(\)\'\"\<\>]+)/ig,
"<a ref='nofollow' href='http://$1'>$1</a>"
);
html = html.replace(
/^(www\.[^\s\(\)\'\"\<\>]+)/ig,
"<a ref='nofollow' href='http://$1'>$1</a>"
);
return html;
URL regexp from Component
não seja comentado, alguma explicação do que está fazendo seria útil.Autolinker.js
é comentado muito bem e tem testes. Aurlize.js
biblioteca vinculada à resposta de Vebjorn Ljosa também parece funcional e bem conservada, embora não tenha testes.