Uso già questo codice per validare url preg_match e funziona bene ma se lo metto in un preg_replace non mi riconosce alcuni caratteri e da errore:
$messaggio = preg_replace("/^((http(s)?:\/\/)|(www\.))([a-z0-9][-.a-z0-9]+)((\.[a-z]{2,4})[?\/]?)([?\/][-_~;:.,'*^+()=!|?£§$%&#A-Za-z0-9\/]*)?$/",'<a href="\0\">\0</a>',$messaggio);