2011-07-09 42 views
0

我在PHP中的小正则表达式脚本变成可点击都是我从看似提取链接解析它们

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; 
} 

和正常工作的字符串的链接,但是我想一个小的调整,要检查时,其一个YouTube链接不使他作为

<a href=youtube>youtube</a> 

而是(如果有youtube链接)作为

<iframe width="425" height="349" src="http://www.youtube.com/embed/youtube" frameborder="0" allowfullscreen></iframe> 

<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

也许添加

$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>'); 

YouTube和

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

的图像。但是你最好用一次呼叫做所有替换,以避免替换已经替换的链接。 preg_replace可以将数组作为模式和替换参数。

但是,您不能确定URL是否链接到图像,直到您收到服务器响应。您只能建议如果链接以“.jpg”,“.jpeg”,“.gif”,“.bmp”结尾,那么它可能是图像。但它可能类似于“http://www.google.com/search?q=trollface.jpg”,以“.jpg”结尾,但不是图像。您可以使用CURL来检查这些链接,但这可能是一个生产力问题。

编辑:好的,您的更新代码存在问题。这个脚本太慢了,因为你发送请求到其他服务器,延迟的主要部分正在为他们的响应而欢呼。首先,我认为当您有像http://www.youtube.com/watch?v=blahblah&feature=blah这样的链接时,不需要检查YouTube上是否有视频。你可以把代码blahblah并嵌入它。如果没有这样的视频,那么YouTube会告诉我们,这是发布该链接的人的问题。我认为我写的preg_replace就足够了。

其次,您为相同的URL调用图像处理函数几次。每次图像必须从其他服务器下载。您只能请求服务器一次 - 将图像(或任何将作为响应)下载到临时文件,然后将其路径而不是URL传递给图像功能。

+0

检查我的编辑,我写了一个脚本,但它的太慢!每个图像3秒... – Master345

+0

更新了我的答案。我认为你的代码出错了。考虑使用带数组的preg_replace作为参数。至少对于图像以外的其他任务。 – Hnatt

+0

YouTube和链接部分速度非常快,只有Check If Image部分很慢,因为我想检查是否真的是图像而不是漏洞或什么的。你认为首先复制是安全的(server_path,my_server)并从那里检查它?我只是生气和疯狂的安全... – Master345