2011-07-28 82 views
3

我想說的是,我所知道的在如此相似的問題,但由於我的情況我認爲這將是更好地打開一個新的問題略有不同。我搜索了一個小時,我可能錯過了一些東西,如果是的話請原諒我這一點。檢測和編輯外部鏈接

問題:我正在開發一個類似於facebook的功能:用戶可以發佈一條可能包含多個鏈接的文本消息,這些可能或很多不會放在定位標記中,並可能有不同的協議(http, HTTPS,FTP,....)

我需要

  1. 檢測這些鏈路也許試圖檢索他們(就像Facebook的)。我想這是jQuery的任務?

  2. 我還需要可靠地檢測外部鏈接,並更改爲mysite.com/external?url=thelink。其中,我認爲,是PHP這個任務(因爲我不能信任的輸入,從客戶端右方來?)

總之,與不保證在錨標籤的鏈接,它不似乎使用dom解析器非常可靠(或者我錯了)? 我在網上找到了一個簡單的正則表達式(IM可怕用正則表達式BTW),我想我可以使用(通過添加更多的協議)

$strText = preg_replace('/(http|ftp)+(s)?:(\/\/)((\w|\.)+)(\/)?(\S+)?/i', '<a href="\0">\4</a>', $strText); 

可以將某些專家那裏誰在這個任務有經驗請指點我正確的方向?

回答

1

啊,這絕對是你想要做服務器端的東西。首先,如果你接受含有HTML標記的用戶輸入,你應該與像HTML Purifier良好的HTML過濾消毒它。 (這也將使他們更容易地輸入解析爲更復雜的標記。)

應該是一個單一的preg_replace內是可行的()語句,但我把它拆分成是這樣的:

$hrefPattern = '/<a[^>]+?href="(.+?)".*?>/i'; 

$outLink = 'http://mysite.com/external?url='; 

$offset = 0; 
while(preg_match($hrefPattern, $text, $hrefMatches, PREG_OFFSET_CAPTURE, $offset)) 
{ 

    $hrefInner = $hrefMatches[1][0]; 
    $offset = $hrefMatches[1][1]; 
    echo $hrefInner . "\r\n"; 

    if(strpos($hrefInner, '://') !== false) 
    { 
     $externalUrl = $outLink . rawurlencode($hrefInner); 
     $text = str_replace($hrefInner, $externalUrl, $text); 
     $offset += strlen($externalUrl); 
    } 

} 

preg_match() documentation解釋說,相當不錯。我們基本上只是查找每個<a ... href="">標籤,抓取它的內容,如果它以(anything)://開頭,則重新格式化它,然後重複,直到$text中沒有更多鏈接。如果您重新設置鏈接的格式,您需要rawurlencode()您要鏈接的鏈接,以確保新鏈接是valid

Facebook爲其鏈接片段抓取內容的方式是,我想可能會比這更復雜,但是 - 是的 - 您希望向PHP頁面發送AJAX請求,以刮擦有問題的鏈接,生成你想要的任何片段。有相當多一點涉及,雖然 - 你必須處理,如果頁面不存在,重定向到另一個頁面,具有無效的標記,不同的文檔類型,等等。

希望有幫助!