2011-03-17 7 views
19

voglio:modo migliore per rendere i link cliccabili in blocco di testo

Here is link: http://google.com 
And http://example.com inside. 
And another one at the very end: http://test.net 

a diventare:

Here is link: <a href="http://google.com">http://google.com</a> 
And <a href="http://example.com">http://example.com</a> inside. 
And another one at the very end: <a href="http://test.net">http://test.net</a> 

sembra un compito banale, ma non posso trova una funzione PHP che funzioni. Hai qualche idea?

function make_links_clickable($text){ 
    // ??? 
} 

$text = 'Here is link: http://google.com 
And http://example.com inside. 
And another one at the very end: http://test.net'; 

echo make_links_clickable($text); 
+0

Domanda duplicata; Vedere a http://stackoverflow.com/questions/5282745/simple-wiki-parser-and-link-autodetection – Akarun

+0

Eventuali duplicati di [sostituire gli URL nel testo con link HTML] (http://stackoverflow.com/questions/1188129/replace-urls-in-text-with-html-links) – cweiske

risposta

45

Utilizzare questo (funziona con ftp, http, FTPS e HTTPS schemi):

function make_links_clickable($text){ 
    return preg_replace('!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()[email protected]:%_+.~#?&;//=]+)!i', '<a href="$1">$1</a>', $text); 
} 
+0

quali sono i '!' Che hai inserito all'inizio e alla fine della regexp? –

+0

! = Il modello (da sostituire) "inizia con" ... – Akarun

+0

Quali sono i caratteri non ASCII nella tua espressione regolare? ('я' e 'Я')? –

6

provare qualcosa di simile:

function make_links_clickable($text) 
{ 
    return preg_replace ('/http:\/\/[^\s]+/i', "<a href=\"${0}\">${0}</a>", $text); 
} 

$result = make_links_clickable($text); 
+1

e che dire di XSS? –

+0

soluzioni fornite nel link suggeriti dal Akarun e da Lawrence Cherone sono più completi becaus controllano l'url a ba un URL valido, si rileva anche https e ftp link, essi urldecode link prima di mostrare loro. La mia soluzione è più sporca, ma funziona per compiti semplici. –

5

si dovrebbe fare riferimento a questa risposta Replace URLs in text with HTML links

+0

e di controllare anche le seguenti risorse per ulteriori informazioni su URL "Linkifying" (Suggerimento: ci sono un sacco di "trucchi"): [Il problema con gli URL] (http://www.codinghorror.com/blog/2008/ 10/il-problema-con-urls.html "di Jeff Atwood") e [una migliore liberale, preciso schema di espressione regolare per gli URL] (http://daringfireball.net/2010/07/improved_regex_for_matching_urls "di John Gruber") e [URL Linkification (HTTP/FTP)] (http://jmrware.com/articles/2010/linkifyurl/linkify.html "Da parte tua"). – ridgerunner

1

Ispirato dalla risposta di Akarun, mi sono inventato questa funzione per gestire tutti i protocolli e i collegamenti che arte con solo www.

function make_links($text, $class='', $target='_blank'){ 
    return preg_replace('!((http\:\/\/|ftp\:\/\/|https\:\/\/)|www\.)([-a-zA-Zа-яА-Я0-9\~\!\@\#\$\%\^\&\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?!ism', 
    '<a class="'.$class.'" href="//$3" target="'.$target.'">$1$3</a>', 
    $text); 
} 

Questa funzione ha parametri opzionali per aggiungere nomi di classe sui link e destinazione anche opzionale per il collegamento, in modo che si aprono su una nuova finestra/tab ... per default il parametro apre collegamenti a nuovo finestra/scheda, ma se hai voglia di non farlo, puoi cambiare il valore predefinito o cambiare il valore quando chiami la funzione.

2

Inoltre, ispirata alla risposta di Akarun, la seguente funzione converte i collegamenti solo nel testo che non è già un collegamento. La funzionalità aggiuntiva sta verificando che un legame con il link di testo catturato non esiste già nella stringa di destinazione:

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; 
} 

Con il test, ho notato che la funzione di cui sopra non riesce in linea # 5. Una funzione "Messier" che fa il lavoro è il seguente:

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; 
} 

Per il nuovo codice, ho usato il tutorial: http://www.the-art-of-web.com/php/parse-links/

2
function makeClickableLinks($text) 
{ 
$text = html_entity_decode($text); 
$text = " ".$text; 
$text= preg_replace("/(^|[\n ])([\w]*?)([\w]*?:\/\/[\w]+[^ \,\"\n\r\t<]*)/is", "$1$2<a href=\"$3\" >$3</a>", $text); 
$text= preg_replace("/(^|[\n ])([\w]*?)((www|wap)\.[^ \,\"\t\n\r<]*)/is", "$1$2<a href=\"http://$3\" >$3</a>", $text); 
$text= preg_replace("/(^|[\n ])([\w]*?)((ftp)\.[^ \,\"\t\n\r<]*)/is", "$1$2<a href=\"$4://$3\" >$3</a>", $text); 
$text= preg_replace("/(^|[\n ])([a-z0-9&\-_\.]+?)@([\w\-]+\.([\w\-\.]+)+)/i", "$1<a href=\"mailto:[email protected]$3\">[email protected]$3</a>", $text); 
$text= preg_replace("/(^|[\n ])(mailto:[a-z0-9&\-_\.]+?)@([\w\-]+\.([\w\-\.]+)+)/i", "$1<a href=\"[email protected]$3\">[email protected]$3</a>", $text); 
$text= preg_replace("/(^|[\n ])(skype:[^ \,\"\t\n\r<]*)/i", "$1<a href=\"$2\">$2</a>", $text); 
     return $text; 
} 

lavoro con:

www. example.com

https://www.example.com

http://www.example.com

wap.example.com

ftp.example.com

[email protected]

skype: esempio

mailto: user @ esempio.com

atherprotocol: //example.com

Problemi correlati