首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字符串中提取链接并将其放入数组中,然后对其进行解析

从字符串中提取链接并将其放入数组中,然后对其进行解析
EN

Stack Overflow用户
提问于 2011-07-09 21:59:32
回答 1查看 585关注 0票数 0

我在PHP中有一个小的正则表达式脚本,它使我的所有链接都可以点击,字符串看起来像这样

代码语言:javascript
复制
function clickable_link($text)
{
$text = preg_replace('#(script|about|applet|activex|chrome):#is', "\\1:", $text);
$ret = ' ' . $text;
$ret = preg_replace("#(^|[\n ])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#is", "\\1<a href=\"\\2\" target=\"_blank\" rel=\"nofollow\" id=\"LinkWordWarp\">\\2</a>", $ret);
$ret = preg_replace("#(^|[\n ])((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*)#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:\\2@\\3\">\\2@\\3</a>", $ret);

return $ret;
}

和工程很好,但我想一个小调整,想检查一下,当它是一个YouTube链接,以不使他作为

代码语言:javascript
复制
<a href=youtube>youtube</a>

而是(如果有youtube链接的话)

代码语言:javascript
复制
<iframe width="425" height="349" src="http://www.youtube.com/embed/youtube" frameborder="0" allowfullscreen></iframe>

代码语言:javascript
复制
<img src="link" />

如果它是一个图像。

任何帮助都将不胜感激。

我已经为所有这些写了一个小脚本,但它太慢了!

代码语言:javascript
复制
<?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\#$%&~/.\-;:=,?@\[\]+]*)#is", "\\1<a href=\"\\2\" target=\"_blank\" rel=\"nofollow\" id=\"LinkWordWarp\">\\2</a>", $ret);
                $ret = preg_replace("#(^|[\n ])((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*)#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:\\2@\\3\">\\2@\\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秒!)我怎么才能解决这个问题呢?

EN

回答 1

Stack Overflow用户

发布于 2011-07-16 18:08:52

也许可以添加

代码语言:javascript
复制
$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和

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

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

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

EDIT:好的,你更新的代码有问题。脚本之所以如此缓慢,是因为您向其他服务器发送请求,而延迟的主要部分是等待它们的响应。首先,当你有像http://www.youtube.com/watch?v=blahblah&feature=blah这样的链接时,我认为没有必要检查youtube上是否有视频。你只需要把代码胡言乱语嵌入进去就行了。如果没有这样的视频,youtube会告诉我们,这是发布链接的人的问题。我想我写的preg_replace已经足够了。

其次,为同一个URL多次调用图像处理函数。并且每次都必须从其他服务器下载映像。您应该只向服务器请求一次--将图像(或任何响应)下载到临时文件,然后将其路径而不是URL传递给图像函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6635181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档