2009-06-24 16 views
5

Zastanawiam się, czy istnieje prosty fragment kodu, który konwertuje linki wszelkiego rodzaju:PHP linki przeczytac/maile

http://www.cnn.com to <a href="http://www.cnn.com">http://www.cnn.com</a> 
cnn.com to <a href="http://www.cnn.com">cnn.com</a> 
www.cnn.com to <a href="http://www.cnn.com">www.cnn.com</a> 
[email protected] to to <a href="mailto:mailto:[email protected]">mailto:[email protected]</a> 

Nie chcę używać żadnej konkretnej biblioteki PHP5.

Dziękuję za poświęcony czas.

AKTUALIZACJA Zaktualizowałem powyższy tekst, do którego chcę go przekonwertować. Należy pamiętać, że znacznik href i tekst są różne w przypadku 2 i 3.

UPDATE2 Hows robi to za pomocą czatu w Gmailu? Ich jest całkiem sprytny i działa tylko dla prawdziwych nazw domen. na przykład a.ly działa, ale a.cb nie działa.

Odpowiedz

4

tak, http://www.gidforums.com/t-1816.html

<?php 
/** 
    NAME  : autolink() 
    VERSION  : 1.0 
    AUTHOR  : J de Silva 
    DESCRIPTION : returns VOID; handles converting 
       URLs into clickable links off a string. 
    TYPE  : functions 
    ======================================*/ 

function autolink(&$text, $target='_blank', $nofollow=true) 
{ 
    // grab anything that looks like a URL... 
    $urls = _autolink_find_URLS($text); 
    if(!empty($urls)) // i.e. there were some URLS found in the text 
    { 
    array_walk($urls, '_autolink_create_html_tags', array('target'=>$target, 'nofollow'=>$nofollow)); 
    $text = strtr($text, $urls); 
    } 
} 

function _autolink_find_URLS($text) 
{ 
    // build the patterns 
    $scheme   =  '(http:\/\/|https:\/\/)'; 
    $www   =  'www\.'; 
    $ip    =  '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'; 
    $subdomain  =  '[-a-z0-9_]+\.'; 
    $name   =  '[a-z][-a-z0-9]+\.'; 
    $tld   =  '[a-z]+(\.[a-z]{2,2})?'; 
    $the_rest  =  '\/?[a-z0-9._\/~#&=;%+?-]+[a-z0-9\/#=?]{1,1}';    
    $pattern  =  "$scheme?(?(1)($ip|($subdomain)?$name$tld)|($www$name$tld))$the_rest"; 

    $pattern  =  '/'.$pattern.'/is'; 
    $c    =  preg_match_all($pattern, $text, $m); 
    unset($text, $scheme, $www, $ip, $subdomain, $name, $tld, $the_rest, $pattern); 
    if($c) 
    { 
    return(array_flip($m[0])); 
    } 
    return(array()); 
} 

function _autolink_create_html_tags(&$value, $key, $other=null) 
{ 
    $target = $nofollow = null; 
    if(is_array($other)) 
    { 
    $target  = ($other['target'] ? " target=\"$other[target]\"" : null); 
    // see: http://www.google.com/googleblog/2005/01/preventing-comment-spam.html 
    $nofollow = ($other['nofollow'] ? ' rel="nofollow"'   : null);  
    } 
    $value = "<a href=\"$key\"$target$nofollow>$key</a>"; 
} 

?> 
+0

nie działa zbyt dobrze. jeśli wpiszę adres www.google.com, jego link pozostaje jako www.google.com zamiast http://www.google.com. Również tylko google.com nie działa. –

+0

jak to zrobić za pomocą czatu w Gmailu? –

+0

Myślę, że robi to, co chce pytający. Po prostu nie jest DOKŁADNIE sformatowany tak, jak chce. Być może będzie musiał nieco zmodyfikować ten kod. – Travis

-1

Oto urywek email:

$email = "[email protected]"; 

$pos = strrpos($email, "@"); 
if (!$pos === false) { 
    // This is an email address! 
    $email .= "mailto:" . $email; 
} 

Co dokładnie szukasz zrobić z linkami? usunąć www lub http? lub dodać http://www do dowolnego łącza, jeśli jest to wymagane?

+0

dodać http: // www, jeśli to konieczne, następnie dodać do nich tag href –

+0

Mam zaktualizowane pytanie. –

2

Spróbuj tego. (Linków nie elektroniczną)

$newTweet = preg_replace('!http://([a-zA-Z0-9./-]+[a-zA-Z0-9/-])!i', '<a href="\\0" target="_blank">\\0</a>', $tweet->text); 
+0

Sprawdziło się doskonale, chociaż potrzebowałem "?" znak do pracy również.Więc użyłem: 'code' preg_replace ('! Http: // ([a-zA-Z0-9./-] + ([? =.] [A-z0-9_] +) *)! ',' \\0 ', $ bla); – Leo

+0

powinno być https?: //, więc bezpieczne linki są również dopasowane –

0

wiem to 5 lat późno, jednak potrzebowałem podobne rozwiązanie i najlepszą odpowiedź dostałam był z użytkownikiem - erwan-dupeux-maire

odpowiedzi

I zapisz tę funkcję. Zastępuje wszystkie łącza w ciągu znaków. Linki mogą być w następujących formatach:

Drugi argument to cel dla łącza (” _blank ',' _top '... może być ustawione na false). Mam nadzieję, że pomoże ...

public static function makeLinks($str, $target='_blank') 
{ 
    if ($target) 
    { 
     $target = ' target="'.$target.'"'; 
    } 
    else 
    { 
     $target = ''; 
    } 
    // find and replace link 
    $str = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="$1" '.$target.'>$1</a>', $str); 
    // add "http://" if not set 
    $str = preg_replace('/<a\s[^>]*href\s*=\s*"((?!https?:\/\/)[^"]*)"[^>]*>/i', '<a href="http://$1" '.$target.'>', $str); 
    return $str; 
}