PHP / RegEx - Converte URLs para links detectando .com / .net / .org / .edu etc

Sei que houve muitas perguntas pedindo ajuda para converter URLs em links clicáveis ​​em strings, mas não encontrei exatamente o que estou procurando.

Eu quero ser capaz de combinar qualquer um dos exemplos a seguir e transformá-los em links clicáveis:

<code>http://www.domain.com
https://www.domain.net
http://subdomain.domain.org
www.domain.com/folder
subdomain.domain.net
subdomain.domain.edu/folder/subfolder
domain.net
domain.com/folder
</code>

Eu não quero corresponder a random.stuff.separated.with.periods.

EDIT: Por favor, tenha em mente que esses URLs precisam ser encontrados dentro de grandes seqüências de texto 'normal'. Por exemplo, eu quero combinar 'domain.net' em "Olá! Venha conferir domain.net!".

Eu acho que isso poderia ser realizado com um regex que pode determinar se o URL correspondente contém .com, .net, .org ou .edu seguido por uma barra ou espaços em branco. Além de um erro de digitação do usuário, não consigo imaginar nenhum outro caso em que uma URL válida tenha um desses seguido por qualquer outra coisa.

Eu sei que existem muitas extensões de domínio válidas, mas não preciso dar suporte a todas elas. Eu posso apenas escolher qual suporte para algo como (com | net | org | edu) na regex. Infelizmente, ainda não tenho conhecimento suficiente sobre regex para saber como implementar isso corretamente.

Espero que alguém possa me ajudar a encontrar uma expressão regular (para uso com o preg_replace do PHP) que possa combinar URLs com base em qualquer texto conectado por um ou mais pontos e terminando com uma das extensões especificadas, seguida por um espaço em branco contendo um das extensões especificadas seguidas por uma barra e possivelmente pastas.

Eu fiz várias pesquisas e até agora não encontrei o que estou procurando. Se já existe uma postagem SO que responde isso, peço desculpas.

Desde já, obrigado.

--- EDITAR 3 ---

Após dias de tentativa e erro e alguma ajuda do SO, veja o que funciona:

<code>preg_replace_callback('#(\s|^)((https?://)?(\w|-)+(\.(\w+|-)*)+(?<=\.net|org|edu|com|cc|br|jp|dk|gs|de)(\:[0-9]+)?(?:/[^\s]*)?)(?=\s|\b)#is',
                create_function('$m', 'if (!preg_match("#^(https?://)#", $m[2]))
                return $m[1]."<a href=\"http://".$m[2]."\">".$m[2]."</a>"; else return $m[1]."<a href=\"".$m[2]."\">".$m[2]."</a>";'),
                $event_desc);
</code>

Esta é uma versão modificada do código do anubhava abaixo e até agora parece fazer exatamente o que eu quero. Obrigado!

questionAnswers(3)

yourAnswerToTheQuestion