Что такое регулярное выражение PHP для преобразования текста, содержащего URL-адрес в гиперссылку?

Что такое шаблон регулярного выражения (в PHP), который заменяет строку гиперссылками, где текст, предшествующий URL-адресу, используется в качестве якорного текста для ссылки? Например:

text a http://example.com ending text 

становится

 <a href="http://example.com">text a</a> ending text 

Другими словами, текст, предшествующий URL-адресу, становится якорным текстом для ссылки.

То, что я действительно хочу, – это вариация следующей функции snipe http://www.snipe.net/2009/09/php-twitter-clickable-links/, но с твистом выше.

Вот модифицированная версия twitterify () :

 <?php function twitterify($ret) { // // Replace all text that precedes a URL with an HTML anchor // that hyperlinks the URL and shows the preceding text as // the anchor text. // // eg, "hello world www.test.com" becomes // <a href="www.test.com" target="_blank">hello world</a> // $ret = preg_replace("#(.*?)(http://)?(www\.[^ \"\t\n\r<]+)#", "<a href=\"http://\\3\" target=\"_blank\">\\1</a>", $ret); // if anchor text is empty, insert anchor's href $ret = preg_replace("#(<a href=\"(\w+://)?([^\"]+)\"[^>]+>)(</a>)#", "\\1\\3\\4", $ret); $ret = preg_replace("/@(\w+)/", "<a href=\"http://www.twitter.com/\\1\" target=\"_blank\">@\\1</a>", $ret); $ret = preg_replace("/#(\w+)/", "<a href=\"http://search.twitter.com/search?q=\\1\" target=\"_blank\">#\\1</a>", $ret); return $ret; } 

Тестирование кода выше с помощью test()

 function test($str) { print "INPUT: \"" . $str . "\"\nOUTPUT: " . twitterify($str) . "\n\n"; } // tests test("www.foo.com"); test("www.foo.com fox"); test("www.test.com fox jumped over www.foo.com"); test("fox jumped over www.test.com the fence www.foo.com"); ?> 

… приводит к следующим распечаткам.

 INPUT: "www.foo.com" OUTPUT: <a href="http://www.foo.com" target="_blank">www.foo.com</a> INPUT: "www.foo.com fox" OUTPUT: <a href="http://www.foo.com" target="_blank">www.foo.com</a> fox INPUT: "www.test.com fox jumped over www.foo.com" OUTPUT: <a href="http://www.test.com" target="_blank">www.test.com</a><a href="http://www.foo.com" target="_blank"> fox jumped over </a> INPUT: "fox jumped over www.test.com the fence www.foo.com" OUTPUT: <a href="http://www.test.com" target="_blank">fox jumped over </a><a href="http://www.foo.com" target="_blank"> the fence </a> 

Протестировано на идеон .

EDIT : обновленный код для соответствия новым требованиям.