Вот другое решение, которое перехватит все http / https / www и преобразуется в интерактивные ссылки.
$url = '~(?:(https?)://([^\s<]+)|(www\.[^\s<]+?\.[^\s<]+))(?<![\.,:])~i';
$string = preg_replace($url, '<a href="$0" target="_blank" title="$0">$0</a>', $string);
echo $string;
В качестве альтернативы просто перехватите http / https, затем используйте код ниже.
$url = '/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/';
$string= preg_replace($url, '<a href="$0" target="_blank" title="$0">$0</a>', $string);
echo $string;
EDIT:
Сценарий ниже будет перехватывать все типы URL и преобразовывать их в интерактивные ссылки.
$url = '@(http)?(s)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';
$string = preg_replace($url, '<a href="http$2://$4" target="_blank" title="$0">$0</a>', $string);
echo $string;
Новое обновление. Если у вас есть строка, удалите эти строки, используйте блок кода ниже. Спасибо @AndrewEllis за указание на это.
$url = '@(http(s)?)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';
$string = preg_replace($url, '<a href="http$2://$4" target="_blank" title="$0">$0</a>', $string);
echo $string;
Вот очень простое решение для некорректного отображения URL.
$email = '<a href="mailto:email@email.com">email@email.com</a>';
$string = $email;
echo $string;
Это очень простое исправление, но вам придется изменить его для своих собственных целей.