2009-02-03 53 views
32

Tôi có chuỗi sau:Làm cách nào để liên kết url trong chuỗi bằng php?

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

tôi cần phải chuyển nó sang:

"Nhìn trên http://www.google.com"

Chuỗi ban đầu có thể có nhiều hơn 1 chuỗi URL.

Làm cách nào để thực hiện việc này trong php?

Cảm ơn

+0

Bạn cần thụt lề nó 4 dấu cách để không xử lý. Tôi đã làm nó cho bạn. –

+0

Cảm ơn! Nó đã giúp, tôi đã sửa nó ngay bây giờ. – Alex

+0

có thể trùng lặp của [Làm thế nào để chuyển đổi một liên kết trong một textarea thành một phần tử liên kết bằng cách sử dụng php?] (Http://stackoverflow.com/questions/6204590/how-to-convert-a-link-in-a-textarea -into-a-link-element-using-php) – kapa

Trả lời

56

Bạn có thể sử dụng như sau:

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

phiên bản PHP < 5.3 (ereg_replace) khác (preg_replace)

+0

Cảm ơn Ben Tôi cũng đã tìm thấy điều này, nhưng chưa có cơ hội để thử nghiệm nó. – Alex

+2

Hoàn hảo !! Nó hoạt động chính xác như tôi muốn. Cảm ơn người đàn ông – Alex

+0

Không phải lo lắng! Tôi bắt đầu cố gắng để viết biểu thức chính quy của riêng mình để làm điều đó, nhưng sau đó nhận ra nó là phức tạp hơn tôi nghĩ ban đầu, vì vậy tôi rất vui vì tôi tìm thấy một cái gì đó trực tuyến! :-) – Ben

2

Bạn sẽ cần phải sử dụng biểu thức thông thường ...

Điều gì đó như thế này sẽ hữu ích.

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

Hãy xem regular expressions. Sau đó bạn sẽ làm điều gì đó like:

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

Bạn đang bỏ lỡ - trong phần đường dẫn phải là '@ (https?: // ([- \ w \.] +) + (: \ d +)? (/ ([- \ w/_ \.] * (\? \ S +)?)?) ?) @ ' – ianbarker

21

lib_autolink làm một công việc khá tốt, tránh những cạm bẫy như dấu chấm câu thêm sau khi liên kết và liên kết bên trong thẻ HTML:

https://github.com/iamcal/lib_autolink

+4

Tôi chưa bao giờ sử dụng nó, và thậm chí hầu như không nhìn vào nó, nhưng điều này có vẻ như là một giải pháp tốt hơn nhiều so với cố gắng để cuộn của riêng bạn. +1 – rmeador

+0

có hiệu quả đối với tôi - các thử nghiệm có thất bại cho bạn không? – Cal

+0

Có cách nào để thực hiện 'http: //' (giao thức) không? Tôi nghĩ có vẻ kỳ lạ khi 'http: //' được xóa tự động. – Nathan

1

Tôi tìm thấy một ví dụ cho phép cho các liên kết bao gồm ftp, https và các liên kết khác có vẻ hoạt động tốt cho nhiều 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; 
?> 

Có thể là một ý tưởng hay để thêm nofollow vào liên kết cũng là giá trị do người dùng gửi.

2

Hãy thử này ...

<? 

    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

Thanh toán chức năng liên kết của tôi, sử dụng preg_replace_callback (chỉ có PHP 5.3). Nó hỗ trợ http, email và 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

Chào mừng bạn đến với Stack Overflow! Trong khi điều này về mặt lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (http://meta.stackexchange.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây, và cung cấp liên kết để tham khảo. –

+0

@BilltheLizard Tôi không hiểu nhận xét của bạn. Mã này thực hiện chính xác những gì Alex đang yêu cầu. Bạn chỉ cần sao chép/dán. –

+3

Câu trả lời của bạn đã được chỉnh sửa sau bình luận của tôi. –

2

tôi tìm thấy mã này ở http://code.seebz.net/p/autolink-php/ và tinh chỉnh nó một chút để nhận ra www * là các liên kết..Tôi không thông thạo với các biểu thức chính quy nhưng tôi nghĩ rằng hai dòng str_replace có thể được sửa đổi thành một regexp

<?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); 
?> 
Các vấn đề liên quan