2011-07-09 8 views
0

を解析し、私は抽出文字列からのリンクや配列にそれらを入れて、それらに

function clickable_link($text) 
{ 
$text = preg_replace('#(script|about|applet|activex|chrome):#is', "\\1:", $text); 
$ret = ' ' . $text; 
$ret = preg_replace("#(^|[\n ])([\w]+?://[\w\#$%&~/.\-;:=,[email protected]\[\]+]*)#is", "\\1<a href=\"\\2\" target=\"_blank\" rel=\"nofollow\" id=\"LinkWordWarp\">\\2</a>", $ret); 
$ret = preg_replace("#(^|[\n ])((www|ftp)\.[\w\#$%&~/.\-;:=,[email protected]\[\]+]*)#is", "\\1<a href=\"http://\\2\" target=\"_blank\" rel=\"nofollow\" id=\"LinkWordWarp\">\\2</a>", $ret); 
$ret = preg_replace("#(^|[\n ])([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "\\1<a href=\"mailto:\\[email protected]\\3\">\\[email protected]\\3</a>", $ret); 

return $ret; 
} 

のように見え、正常に動作した文字列からクリック可能なすべての私のリンクを作ったPHPで少し正規表現のスクリプトを持っていますが、私は

<iframe width="425" height="349" src="http://www.youtube.com/embed/youtube" frameborder="0" allowfullscreen></iframe> 
として(ユーチューブリンクがある場合)

<a href=youtube>youtube</a> 

ではなく、として彼を作るしないようにするとき、そのYouTubeのリンクをチェックしたい、小さな調整をしたいと思います

<img src="link" /> 

それはイメージである場合。

ご協力いただければ幸いです。

は、私はすべてのことのために小さなスクリプトを書きましたが、その遅すぎる!!!!!!!!!います

<?php 

function MakeContentInteractive($string) 
{ 
    $order = array("<br>", "<br/>", "<br />"); 
    $replace = ' <br/> '; 
    $string = str_replace($order, $replace, $string); 

    $firstImageSetted = false; 
    $firstImage = ""; 
    $allval = ""; 
    $pieces = explode(" ", $string); 
    $regex = "^(((ht|f)tp(s?))\://)?(www.|[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk|co|tk)(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&amp;%\$#\=~_\-]+))*$^"; // SCHEME 

    $i=0; 
    foreach($pieces as $val) 
    { 
     echo $val."<hr>"; 
     $i++; 
     $url = $val; 
     $url = str_replace(" ", "+", $url); 
     $strlen = strlen($url); 
     $ext = substr($val,$strlen-4,$strlen); 
     $random = rand(1000000,9000000); 
     if(preg_match($regex, $url)) 
     { 
      /*CHECK IF IS YOUTUBE*/ 
      $pos = strpos($url,"youtube.com"); 
      if ($pos !== false) 
      { 
       //retrive video from link 
       $videoLink = $val; 
       $videoLinkPharser = $videoLink; 
       $videoLinkPharser = substr($videoLinkPharser, 2, 42); 
       $vid = substr($videoLinkPharser, -11, 42); 

       //check if youtube link is valid 
       $youtubeId = $vid; 
       // Check if youtube video item exists by the existance of the the 200 response 
       $headers = get_headers('http://gdata.youtube.com/feeds/api/videos/' . $vid); 
       if (!strpos($headers[0], '200')) 
       { 
        $valid = 0; 
       } 
       else 
       { 
        $isYoutube = 1; 
        $valid = 1; 
        $code = '<div id="YoutubeLink"><iframe width="425" height="349" src="http://www.youtube.com/embed/'.$vid.'" frameborder="0" allowfullscreen></iframe></div>'; 
        $allval = $allval.$code; 
       } 

      } 



      if(!$isYoutube == 1) 
      { 
       $url=trim($url); 
       /*CHECK IF IS PICTURE*/ 
       $mime = getimagesize($url); 
       $mime = $mime['mime']; 

       if($mime == "image/gif" or $mime == "image/jpeg" or $mime == "image/png") 
       { 

        echo $url; 
        if(exif_imagetype($url) == IMAGETYPE_GIF and $ext == ".gif") 
        { 
         $isPicture = 1; 
         $filename =$random.basename($url); 
         $code = '<div id="CategoryPicture"><img src="'.$val.'" width="100" height="100" /><div>'; 
         $allval = $allval.$code; 

         if($firstImageSetted == false) 
         { 
          $firstImage=$val; 
          $firstImageSetted = true; 
         } 

        } 

        if(exif_imagetype($url) == IMAGETYPE_JPEG and $ext == ".jpg") 
        { 
         $isPicture = 1; 
         $filename =$random.basename($url); 
         $code = '<div id="CategoryPicture"><img src="'.$val.'" width="100" height="100" /><div>'; 
         $allval = $allval.$code; 

         if($firstImageSetted == false) 
         { 
          $firstImage=$val; 
          $firstImageSetted = true; 
          echo "JPG!"; 
         } 
        } 

        if(exif_imagetype($url) == IMAGETYPE_PNG and $ext == ".png") 
        { 
         $isPicture = 1; 
         $filename =$random.basename($url); 
         $code = '<div id="CategoryPicture"><img src="'.$val.'" width="100" height="100" /><div>'; 
         $allval = $allval.$code; 

         if($firstImageSetted == false) 
         { 
          $firstImage=$val; 
          $firstImageSetted = true; 
         } 
        } 
       } 


      } 

      /*IF not YOUTUBE or PICTURE then it's a link*/ 
      if(!$isYoutube == 1 and !$isPicture == 1) 
      { 

       $text = preg_replace('#(script|about|applet|activex|chrome):#is', "\\1:", $url); 
       $ret = ' ' . $text; 

       $ret = preg_replace("#(^|[\n ])([\w]+?://[\w\#$%&~/.\-;:=,[email protected]\[\]+]*)#is", "\\1<a href=\"\\2\" target=\"_blank\" rel=\"nofollow\" id=\"LinkWordWarp\">\\2</a>", $ret); 
       $ret = preg_replace("#(^|[\n ])((www|ftp)\.[\w\#$%&~/.\-;:=,[email protected]\[\]+]*)#is", "\\1<a href=\"http://\\2\" target=\"_blank\" rel=\"nofollow\" id=\"LinkWordWarp\">\\2</a>", $ret); 
       $ret = preg_replace("#(^|[\n ])([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "\\1<a href=\"mailto:\\[email protected]\\3\">\\[email protected]\\3</a>", $ret); 

       $code = '<a href="'.$url.'">'.$url.'</a>'; 
       $allval = $allval.$ret; 

      } 


      $isYoutube = 0; 
      $isPicture = 0; 


     } 
     else 
     { 
      $allval = $allval.$val; 
     } 

    } 

    echo "and the first image is: ".$firstImage."<br/>"; 
    return $allval; 


} 
?> 

そして、exifとgetimageのサイズ(画像あたり3秒!!!)で画像をチェックするのが遅いのですが、どうすれば解決できますか?

答えて

0

たぶんYouTubeやイメージのため

$ret = preg_replace("#https?\://[a-z0-9\-.]*/[^\s]+((\.jpg)|(\.jpeg)|(\.png)|(\.gif)|(\.bmp))#is", 
      '<img src="\0" />'); 

ため

$ret = preg_replace("#http\://www.youtube.com/watch\?v=([a-z0-9-_])+(&feature=[a-z_]*)*#is", 
      '<iframe width="425" height="349" src="http://www.youtube.com/embed/\1" frameborder="0" allowfullscreen></iframe>'); 

を追加します。しかし、すでに置き換えられたリンクを置き換えることを避けるために、1回の呼び出しですべての置換を行うことをお勧めします。 preg_replaceは、配列をパターンと置換の引数として取ることができます。

しかし、画像へのURLリンク場合は、それから、サーバの応答を取得するまで、あなたは確認することはできません。リンクが ".jpg"、 ".jpeg"、 ".gif"、 ".bmp"で終わる場合は、イメージである可能性があります。しかし、それは "http://www.google.com/search?q=trollface.jpg"のようなもので、 ".jpg"で終わりますが、イメージではありません。このようなリンクを確認するにはCURLを使用できますが、これは生産性の問題です。

EDIT:OK、更新されたコードに問題があります。他のサーバーにリクエストを送信し、遅延の主要部分が応答するため、スクリプトは非常に遅いです。まず、私はそれはあなたがhttp://www.youtube.com/watch?v=blahblah&feature=blahのようなリンクを持っている場合、映像がユーチューブに存在しているかどうかをチェックする必要はないと思います。あなたは、コードblahblahを取ってそれを埋め込むことができます。そのようなビデオがない場合、YouTubeはそれについて教えてくれるでしょう、これはそのリンクを投稿した人の問題です。私が書いたpreg_replaceは十分だと思います。

第二に、あなたは画像処理機能と同じURLに対して複数回呼び出します。そして、毎回、他のサーバーから画像をダウンロードする必要があります。一時的なファイルに画像をダウンロードしてから(または応答があるものを)一時的なファイルにダウンロードして、URLの代わりにパスを画像機能に渡すように、サーバーを一度だけ要求する必要があります。

+0

私の編集をチェックし、私はスクリプトを書きましたが、そのTOO SLOWW!画像あたり3秒... – Master345

+0

私の答えを更新しました。あなたのコードは少し間違っていたと思います。配列としてpreg_replaceを引数として使用することを検討してください。少なくともイメージ以外のタスクの場合。私は実際に画像ではなく利用するか何かであるかどうかを確認したいので、画像の一部が、遅い場合 – Hnatt

+0

ユーチューブとリンク部は、唯一のチェックは非常に高速です。最初にコピー(server_path、my_server)してそこからチェックするのは安全だと思いますか?私はちょうど怒っているとセキュリティに狂っている... – Master345

関連する問題