PHP / RegEx - Convierte URL a enlaces detectando .com / .net / .org / .edu, etc.

Sé que ha habido muchas preguntas que solicitan ayuda para convertir las URL a enlaces en los que se puede hacer clic en cadenas, pero no he encontrado exactamente lo que estoy buscando.

Quiero poder coincidir con cualquiera de los siguientes ejemplos y convertirlos en enlaces seleccionables:

<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>

No quiero hacer coincidir random.stuff.separated.with.periods.

EDITAR: tenga en cuenta que estas URL deben encontrarse dentro de cadenas más grandes de texto "normal". Por ejemplo, quiero hacer coincidir 'domain.net' en "¡Hola! ¡Venga a visitar domain.net!".

Creo que esto podría lograrse con una expresión regular que pueda determinar si la url coincidente contiene .com, .net, .org o .edu seguido de una barra diagonal o un espacio en blanco. Aparte de un error tipográfico de usuario, no puedo imaginar ningún otro caso en el que una URL válida tenga una de esas seguidas por cualquier otra cosa.

Me doy cuenta de que hay muchas extensiones de dominio válidas por ahí, pero no necesito admitirlas todas. Solo puedo elegir a qué apoyar con algo como (com | net | org | edu) en la expresión regular. Desafortunadamente, no tengo la suficiente experiencia con expresiones regulares para saber cómo implementar esto correctamente.

Espero que alguien pueda ayudarme a encontrar una expresión regular (para usar con preg_replace de PHP) que pueda hacer coincidir las URL en función de casi cualquier texto conectado por uno o más puntos y que termine con una de las extensiones especificadas seguidas de espacios en blanco O que contengan una de las extensiones especificadas seguidas de una barra y posiblemente de carpetas.

Hice varias búsquedas y hasta ahora no he encontrado lo que estoy buscando. Si ya existe una publicación SO que responda a esto, me disculpo.

Gracias por adelantado.

--- EDITAR 3 ---

Después de días de prueba y error y algo de ayuda de SO, esto es lo 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 es una versión modificada del código de anubhava a continuación y hasta ahora parece hacer exactamente lo que quiero. ¡Gracias!

Respuestas a la pregunta(3)

Su respuesta a la pregunta