2009-02-03 15 views
32

Mam następujący ciąg:Jak mogę połączyć adresy URL za pomocą php?

"Look on http://www.google.com". 

Trzeba przekonwertować go do:

"Spójrz na http://www.google.com"

oryginalny łańcuch może mieć więcej niż 1 ciąg URL.

Jak to zrobić w php?

Dzięki

+0

Musisz wcięcie 4 spacji, aby go nie przetwarzać. Zrobiłem to dla ciebie. –

+0

Dzięki! Pomogło, naprawiłem to teraz. – Alex

+0

możliwy duplikat [Jak przekonwertować łącze w textarea na element linku za pomocą php?] (Http://stackoverflow.com/questions/6204590/how-to-convert-a-link-in-a-textarea -into-a-link-element-using-php) – kapa

Odpowiedz

56

można użyć następujących:

$string = "Look on http://www.google.com"; 
$string = preg_replace(
       "~[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]~", 
       "<a href=\"\\0\">\\0</a>", 
       $string); 

wersjach PHP < 5,3 (ereg_replace) inaczej (preg_replace)

+0

Dzięki Ben Znalazłem to również, ale nie mam jeszcze okazji go przetestować. – Alex

+2

Perfect !! Działa dokładnie tak, jak chciałem. Dzięki człowiek – Alex

+0

Bez obaw! Zacząłem próbować napisać własną regularną wypowiedź, żeby to zrobić, ale potem zdałem sobie sprawę, że to było trudniejsze, niż początkowo sądziłem, więc cieszę się, że znalazłem coś online! :-) – Ben

2

Trzeba będzie użyć wyrażeń regularnych ...

Coś w tym stylu pomoże.

$result = preg_replace('/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[A-Z0-9+&@#\/%=~_|]/i', '<a href="\0">\0</a>', $text); 
6

Spójrz na regular expressions. Można by wtedy zrobić coś like:

$text = preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', '<a href="$1">$1</a>', $text); 
+1

Tęsknisz za - w części ścieżki to powinno być '@ (https?: // ([- \ w \.] +) + (: \ d +)? (/ ([- \ w/_ \.] * (\? \ S +)?)?) ?) @ ' – ianbarker

21

lib_autolink robi bardzo dobrą pracę, unikając pułapek, jak dodatkowe znaki interpunkcyjne po linku i linki wewnątrz znaczników HTML:

https://github.com/iamcal/lib_autolink

+4

Nigdy go nie używałem, a nawet nie patrzyłem na to, ale wydaje się, że to o wiele lepsze rozwiązanie niż próba wyrzucenia własnego. +1 – rmeador

+0

działa dla mnie - czy testy się nie udają? – Cal

+0

Czy istnieje sposób na utrzymanie 'http: //' (protokołu)? Myślę, że wygląda dziwnie, gdy 'http: //' jest usuwany automatycznie. – Nathan

1

znalazłem przykład, który pozwala w przypadku linków zawierających ftp, https i inne, które wydają się działać dobrze dla wielu adresów URL:

how-to-detect-urls-in-text-and-convert-to-html-links-php-using-regular-expressions

<?php 
// The Regular Expression filter 
$pattern = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/"; 

//example text 
$text="Example user text with a URL http://www.zero7web.com , second link http://www.didsburydesign.co.uk"; 

// convert URLs into Links 
$text= preg_replace($pattern, "<a href=\"\\0\" rel=\"nofollow\">\\0</a>", $text); 

echo $text; 
?> 

Niewłaściwie dobrym pomysłem jest dodanie nofollow do linku, ponieważ jest to wartość przesłana przez użytkownika.

2

Spróbuj tego ...

<? 

    function link_it($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)\.[^ \,\"\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=\"ftp://$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); 
     return($text); 
    } 


$text = "ini link gue: http://sapua.com <br> 
https://sapua.com <br> 
anything1://www.sss.com <br> 

dua www.google.com <br> 
tiga http://www.google.com <br> 

ftp.sapua.com <br> 

[email protected] 


"; 

print link_it($text); 

?> 
1

Zamówienie mojej funkcji, która używa preg_replace_callback (tylko PHP 5.3). Obsługuje protokoły HTTP, e-mail i Twitter

http://www.jasny.net/articles/linkify-turning-urls-into-clickable-links-in-php/

/** 
* Turn all URLs in clickable links. 
* 
* @param string $value 
* @param array $protocols http/https, ftp, mail, twitter 
* @param array $attributes 
* @param string $mode normal or all 
* @return string 
*/ 
    function linkify($value, $protocols = array('http', 'mail'), array $attributes = array(), $mode = 'normal') 
    { 
     // Link attributes 
     $attr = ''; 
     foreach ($attributes as $key => $val) { 
      $attr = ' ' . $key . '="' . htmlentities($val) . '"'; 
     } 

     $links = array(); 

     // Extract existing links and tags 
     $value = preg_replace_callback('~(<a .*?>.*?</a>|<.*?>)~i', function ($match) use (&$links) { return '<' . array_push($links, $match[1]) . '>'; }, $value); 

     // Extract text links for each protocol 
     foreach ((array)$protocols as $protocol) { 
      switch ($protocol) { 
       case 'http': 
       case 'https': $value = preg_replace_callback($mode != 'all' ? '~(?:(https?)://([^\s<]+)|(www\.[^\s<]+?\.[^\s<]+))(?<![\.,:])~i' : '~([^\s<]+\.[^\s<]+)(?<![\.,:])~i', function ($match) use ($protocol, &$links, $attr) { if ($match[1]) $protocol = $match[1]; $link = $match[2] ?: $match[3]; return '<' . array_push($links, '<a' . $attr . ' href="' . $protocol . '://' . $link . '">' . $link . '</a>') . '>'; }, $value); break; 
       case 'mail': $value = preg_replace_callback('~([^\s<][email protected][^\s<]+?\.[^\s<]+)(?<![\.,:])~', function ($match) use (&$links, $attr) { return '<' . array_push($links, '<a' . $attr . ' href="mailto:' . $match[1] . '">' . $match[1] . '</a>') . '>'; }, $value); break; 
       case 'twitter': $value = preg_replace_callback('~(?<!\w)[@#](\w++)~', function ($match) use (&$links, $attr) { return '<' . array_push($links, '<a' . $attr . ' href="https://twitter.com/' . ($match[0][0] == '@' ? '' : 'search/%23') . $match[1] . '">' . $match[0] . '</a>') . '>'; }, $value); break; 
       default: $value = preg_replace_callback($mode != 'all' ? '~' . preg_quote($protocol, '~') . '://([^\s<]+?)(?<![\.,:])~i' : '~([^\s<]+)(?<![\.,:])~i', function ($match) use ($protocol, &$links, $attr) { return '<' . array_push($links, '<a' . $attr . ' href="' . $protocol . '://' . $match[1] . '">' . $match[1] . '</a>') . '>'; }, $value); break; 
      } 
     } 

     // Insert all link 
     return preg_replace_callback('/<(\d+)>/', function ($match) use (&$links) { return $links[$match[1] - 1]; }, $value); 
    } 
+0

Witamy w Stack Overflow! Chociaż może to teoretycznie odpowiedzieć na pytanie, [byłoby lepiej] (http://meta.stackexchange.com/q/8259) uwzględnić istotne części odpowiedzi tutaj i podać link do odniesienia. –

+0

@ BilltheLizard Nie rozumiem twojej uwagi. Ten kod robi dokładnie to, o co prosił Alex. Wystarczy skopiować/wkleić. –

+3

Twoja odpowiedź została zmieniona po moim komentarzu. –

2

znalazłem ten kod na http://code.seebz.net/p/autolink-php/ i manipulowane to trochę rozpoznać www * jako linki..Nie jestem zaznajomiony z wyrażeniami regularnymi, ale myślę, że dwie linie str_replace można zmodyfikować do jednego wyrażenia regularnego:

<?php 
$text = 'First link is: www.example.com. Second link is http://example.com. Third link is https://example.com. Fourth link is http://www.example.com. Fifth link is <a href="http://www.example.com">www.example.com</a>'; 

function autolink($str, $attributes=array()) { 
$str = str_replace("http://www","www",$str); 
$str = str_replace("https://www","www",$str); 

$attrs = ''; 
foreach ($attributes as $attribute => $value) { 
$attrs .= " {$attribute}=\"{$value}\""; 
} 
$str = ' ' . $str; 
$str = preg_replace(
'`([^"=\'>])((http|https|ftp)://[^\s<]+[^\s<\.)])`i', 
'$1<a href="$2"'.$attrs.'>$2</a>', 
$str 
); 
$str = preg_replace(
'`([^"=\'>])((www).[^\s<]+[^\s<\.)])`i', 
'$1<a href="http://$2"'.$attrs.'>$2</a>', 
$str 
); 
$str = substr($str, 1); 
return $str; 
} 

echo autolink($text); 
?> 
Powiązane problemy