2012-02-05 34 views
8

mã sau được sử dụng để tìm url từ chuỗi bằng php. Đây là mã:Tìm url từ chuỗi với php

$string = "Hello http://www.bytes.com world www.yahoo.com"; 
preg_match('/(http:\/\/[^\s]+)/', $string, $text); 
$hypertext = "<a href=\"". $text[0] . "\">" . $text[0] . "</a>"; 
$newString = preg_replace('/(http:\/\/[^\s]+)/', $hypertext, $string); 
echo $newString; 

Vâng, nó cho thấy một liên kết, nhưng nếu tôi cung cấp vài liên kết nó không hoạt động và cũng có thể nếu tôi viết mà không http: // sau đó nó không hiển thị liên kết. Tôi muốn bất kỳ liên kết được cung cấp nó nên được hoạt động, Giống như stackoverflow.com.

Bất kỳ sự giúp đỡ xin vui lòng ..

+3

thể trùng lặp của [PHP: Regular Expression để có được một URL từ một chuỗi] (http://stackoverflow.com/questions/2720805/php -nút-expression-to-get-a-url-từ-chuỗi) – Gordon

Trả lời

17

Một phương pháp làm việc để liên kết với http/https/ftp/FTPS/scp/SCPS: $newStr = preg_replace('!(http|ftp|scp)(s)?:\/\/[a-zA-Z0-9.?&_/]+!', "<a href=\"\\0\">\\0</a>",$str);

Tôi khuyên KHÔNG nối khi nó chỉ có một dấu chấm, bởi vì nó sẽ xem xét các liên kết PHP 5.2, ASP.NET, vv, hầu như không thể chấp nhận được.

Cập nhật: nếu bạn muốn www. dây là tốt, hãy xem this.

+1

cũng @axiomer, nhưng nó không hoạt động nếu tôi viết www.example.com – user1161867

+0

Cập nhật giải pháp của tôi bằng một liên kết (Tôi đã không kiểm tra nó nhưng nó sẽ làm việc, tôi nghĩ). – axiomer

+0

THANKS A LOT. IT'S WORK :)) – user1161867

3

Nếu bạn muốn phát hiện một cái gì đó như stackoverflow.com, thì bạn sẽ phải kiểm tra tất cả TLD có thể loại trừ một số thứ như Web 2.0, khá là long list. Tuy nhiên, điều này cũng sẽ tương xứng với một cái gì đó như ASP.NET, vv

Các regex sẽ trông giống như sau:

$hypertext = preg_replace(
    '{\b(?:http://)?(www\.)?([^\s]+)(\.com|\.org|\.net)\b}mi', 
    '<a href="http://$1$2$3">$1$2$3</a>', 
    $text 
); 

này chỉ phù hợp với lĩnh vực kết thúc bằng .com, .org và .net ... như tuyên bố trước đó, bạn sẽ phải mở rộng danh sách này để phù hợp với tất cả các tên miền cấp cao

+0

Điều này chỉ hoạt động đối với phần tên miền. Nếu chuỗi bao gồm các thư mục và/hoặc tệp, liên kết sẽ kết thúc trước các chuỗi đó. – doubleJ

0

@axiomer dụ của bạn đã không hoạt động nếu liên kết sẽ có định dạng:

https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl

giải pháp đúng:

preg_replace('!(http|ftp|scp)(s)?:\/\/[a-zA-Z0-9.?%=&_/]+!', "<a href=\"\\0\">\\0</a>", $content); 

sản xuất:

<a href="https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl">https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl</a>