Hai provato a trovarla da solo una soluzione?

Comunque innanzitutto ti conisglio questo sito http://regexlib.com/.

Poi visto che ero in vena mi sono fatto l'esercizietto che tu hai proposto, ed ecco il risultato:

codice:
<?php
// Prima soluzione
$stringa = "Visita il mio sito www.html.it oppure quello del mio amico http://www.google.it/";

echo $stringa."
";

$regex = "((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?";

$stringa2 = preg_replace('#'.$regex.'#', "<a href=\"$0\">$0</a>", $stringa);

echo $stringa2."
";

// soluzione 2

/**
 * Passando un link a questa funzione controlla che inizi con il protocollo
 * http, in caso contrario modifica la stringa e la ritorna con il protocollo http aggiunto.
 *
 * @param string URL
 * @return string URL modificato
 */

function addhttp($webpage) {

  $pos = strpos($webpage, 'http://');

  if($pos === false && $webpage!= '') {

    $webpage = "http://".$webpage;

  }

  return $webpage;

}

preg_match_all('#'.$regex.'#', $stringa, $risultato);



$cerca = $risultato[0];

$sostituisci = array();

foreach($cerca as $valore) {

  $sostituisci[] = ''.addhttp($valore).'';

}

$stringa2 = str_replace($cerca, $sostituisci, $stringa);

echo $stringa2."
";
?>
Se provi il codice vedrai che la prima soluzione è più compatta ma fallisce nel caso in cui tu abbia un link senza l'http davanti. La seconda è un mix di espressioni regolari e str_replace.

Ciao

edit:
Tieni presente che nel codice che ho postato la prima stringa è testuale, ma evidentemente il forum usa una funzione simile a quella che ti ho postato per trasformarli gli url in link.