2011-07-28 8 views
3

私は同様の質問をしていることを認識していますが、私の状況はわずかに異なるので、新しい質問を開く方が良いと思いました。私は1時間の検索をした、私は何かを逃している可能性がありますので、そのために私を許してください。外部リンクを検出して編集する

問題:私はfacebookに似た機能を開発しています:ユーザーはアンカータグに入れられるかもしれない多くのリンクを含んでいるかもしれないテキストメッセージを投稿することができ、 HTTPS、FTP、....)

私は

  1. する必要がこれらのリンクを検出すると、おそらくちょうどFacebookのような、それらを()を取得しようとします。私はこれがjqueryの仕事だと思いますか?

  2. また、外部リンクを確実に検出し、mysite.com/external?url=thelinkに変更する必要があります。これは、私は信じている、PHPのためのそのタスクである(私はクライアント側の右からの入力を信頼することはできませんので、?)

とにかく、アンカータグにあることが保証されないリンクを持つ、それはしていません(または私は間違っていますか?) は、私は、Web上の簡単な正規表現を見つけた私は(多くの、より多くのプロトコルを追加することによって)

$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に残るリンクがなくなるまで繰り返します。リンクを再フォーマットする場合は、新しいリンクがvalidであることを確認するために削ったリンクをrawurlencode()にする必要があります。

Facebookのリンクスニペットのコンテンツをスクラップする方法は、それよりもはるかに複雑だと思いますが、はい、問題のリンクをスクラップするPHPページにAJAXリクエストを送信したいと思います任意のスニペットを生成します。 かなりですが、ページが存在しない場合や、別のページにリダイレクトされたり、無効なマークアップやドキュメントの種類などがある場合は、処理する必要があります。

希望に役立ちます!

関連する問題