Również zainspirowany odpowiedzią Akarun, poniższa funkcja zwróci się do linków tylko tekst, który nie jest jeszcze linkiem. Dodana funkcjonalność jest sprawdzenie, czy związek z przechwyconego link tekstowy nie istnieje już w ciągu docelowym:
function make_links_from_http($content) {
// Links out of text links
preg_match_all('!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()[email protected]:%_+.~#?&;//=]+)!i', $content, $matches);
foreach ($matches[0] as $key=>$link) {
if (!preg_match('!<a(.*)'.$link.'(.*)/a>!i', $content))
{
$content = str_replace($link, '<a href="'.$link.'" target="_blank">'.$link.'</a>', $content);
}
}
return $content;
}
testując, zauważyłem, że powyższa funkcja nie działa na linii # 5. Funkcja "bałaganu", który spełnia swoje zadanie jest następujące:
function make_links_from_http($content)
{
// The link list
$links = array();
// Links out of text links
preg_match_all('!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()[email protected]:%_+.~#?&;//=]+)!i', $content, $matches);
foreach ($matches[0] as $key=>$link)
{
$links[$link] = $link;
}
// Get existing
preg_match_all('/<a\s[^>]*href=([\"\']??)([^\" >]*?)\\1[^>]*>(.*)<\/a>/siU', $content, $matches);
foreach ($matches[2] as $key=>$value)
{
if (isset($links[$value]))
{
unset($links[$value]);
}
}
// Replace in content
foreach ($links as $key=>$link)
{
$content = str_replace($link, '<a href="'.$link.'" target="_blank">'.$link.'</a>', $content);
}
return $content;
}
Dla nowego kodu, użyłem tutorial pod adresem: http://www.the-art-of-web.com/php/parse-links/
Duplikat pytania; Zobacz na http://stackoverflow.com/questions/5282745/simple-wiki-parser-and-link-autodetection – Akarun
Możliwy duplikat [Zamień adresy URL w tekście za pomocą linków HTML] (http://stackoverflow.com/questions/1188129/replace-urls-in-text-with-html-links) – cweiske