2010-11-18 38 views
9

Tôi có chức năng sẽ thêm thẻ <a href> trước liên kết và </a> sau liên kết. Tuy nhiên, nó phá vỡ cho một số trang web. Bạn sẽ cải thiện chức năng này như thế nào? Cảm ơn!PHP - Thêm liên kết vào URL trong chuỗi

function processString($s) 
{ 
    // check if there is a link 

    if(preg_match("/http:\/\//",$s)) 
    { 
     print preg_match("/http:\/\//",$s); 


     $startUrl = stripos($s,"http://"); 

     // if the link is in between text 
     if(stripos($s," ",$startUrl)){ 
      $endUrl = stripos($s," ",$startUrl); 
     } 
     // if link is at the end of string 
     else {$endUrl = strlen($s);} 

     $beforeUrl = substr($s,0,$startUrl); 
     $url = substr($s,$startUrl,$endUrl-$startUrl); 
     $afterUrl = substr($s,$endUrl); 

     $newString = $beforeUrl."<a href=\"$url\">".$url."</a>".$afterUrl; 

     return $newString; 
    } 

    return $s; 
} 
+0

Các regex là một chút cẩu thả, nhưng 99% số đầu vào của tôi sẽ có URL đúng nếu có – AlexBrand

+4

gì trang web nào nó phá vỡ không? –

+0

Lúc đầu, bạn kiểm tra lại https cũng, nhưng sau đó bạn bỏ qua "s". Không biết, nếu điều này gây ra lỗi này, bởi vì tôi cũng không biết, trang nào bị hỏng;) – KingCrunch

Trả lời

18
function processString($s) { 
    return preg_replace('/https?:\/\/[\w\-\.!~#?&=+\*\'"(),\/]+/','<a href="$0">$0</a>',$s); 
} 
+0

Tôi nghĩ rằng một "=" bị thiếu: nó không thành công khi url chứa tham số. Tôi chỉ cần thêm nó sau "&" và bây giờ nó hoạt động: 'preg_replace ('/ https?: \/\/[\ W \ - \.! ~? & = + \ * \'"(), \ /] +/',' $0 ', $ s) ' – Narcolessico

+4

Bạn quên địa chỉ với # bên trong - vì vậy phiên bản chính xác hơn là« preg_replace ('/https?: \/\/[\ W \ - \.! ~ # ? & = + \ * \ '"(), \ /] + /', '$0', $ văn bản)' –

+0

Tôi vừa chỉnh sửa câu trả lời để phản ánh hai bổ sung này. –

1

Nó phá vỡ cho tất cả các URL có chứa "đặc biệt" nhân vật HTML. Để an toàn, hãy chuyển qua ba thành phần chuỗi thông qua htmlspecialchars() trước khi ghép chúng lại với nhau (trừ khi bạn muốn cho phép HTML bên ngoài URL).

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

Tìm thấy nó here

+0

không thành công ở đây: ' http: //www.xyz.com/~this-does-not-work! ' – stillstanding

+0

khớp với" a ... a "- lạ – AlexBrand

+0

Kịch bản tương tự tôi cần trong Jquery/Javascript. Có ai giúp được không? – Yuv

Các vấn đề liên quan