Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取最大的图像_Php_Simple Html Dom - Fatal编程技术网

Php 获取最大的图像

Php 获取最大的图像,php,simple-html-dom,Php,Simple Html Dom,我正在做一个图像搜索项目,我想得到一页最大的图像。 我添加了一些代码来修复图像的真实地址,删除可能是广告的图像。比较那里的宽度*高度回声出最大的一个。但是我的代码有一些问题。这是我的全部代码。有谁能帮我解决哪里出了问题以及如何优化代码,我觉得这个过程是一个痛苦的过程。谢谢大家 <?php require_once 'simple_html_dom.php'; require 'url_to_absolute.php'; //get image absolute url $v = 'http

我正在做一个图像搜索项目,我想得到一页最大的图像。 我添加了一些代码来修复图像的真实地址,删除可能是广告的图像。比较那里的宽度*高度回声出最大的一个。但是我的代码有一些问题。这是我的全部代码。有谁能帮我解决哪里出了问题以及如何优化代码,我觉得这个过程是一个痛苦的过程。谢谢大家

<?php
require_once 'simple_html_dom.php';
require 'url_to_absolute.php'; //get image absolute url
$v = 'http://www.yomiuri.co.jp/stream/';
$html = file_get_html($v);
$maxsize = -1; 
$the_biggest_image = false;
$arr = array('ad', 'ads','gif');// add ads possible words as a arry which is check in the image url
foreach($html->find('img') as $element) {
    preg_match_all('#https?://(.*?)($|/)#m', urldecode(stripcslashes($v)), $r); //get site base url
    $pic = $element->src;
    $comm = url_to_absolute( $r[0][0], $pic);//get image absolute url
    $check_flag = true;
    foreach($arr as $item) {
        if (substr_count(strtolower($comm),$item) > 0) $check_flag = false;
    }// remove ads images
    if ($check_flag) $arr = @getimagesize($comm);// get the rest images width and height
    reset($comm);
        if (($arr[0] * $arr[1]) > $maxsize) {   
            $maxsize = $arr[0] * $arr[1];  //compare images' sise
            $the_biggest_image = $comm;
            echo '<img src="'.$the_biggest_image.'" />'; //echo the biggest one
        }
}
?>

您还没有真正说出您的错误,但幸运的是,您的代码中有几个错误。可能会给您带来错误的错误在该块中:

if ($check_flag) $arr = @getimagesize($comm);// get the rest images width and height
reset($comm);
if (($arr[0] * $arr[1]) > $maxsize) {   
    $maxsize = $arr[0] * $arr[1];  //compare images' sise
    $the_biggest_image = $comm;
    echo '<img src="'.$the_biggest_image.'" />'; //echo the biggest one
}

基于您的代码,我创建了以下解决方案-它使用相同的逻辑,允许您设置图像的最小宽度和高度,以确保返回正确的图像

private function getMainImageFromUrl($pageUrl) {

    $biggestImage = '';
    $minImgWidth = 300;
    $minImgHeight = 300;
    $images = $this->getImagesFromDom($pageUrl);
    $visited = array();
    $maxSize = -1;
    $ignore = array('ad', 'ads','gif'); // get rid of ads (check if these contains following)

    foreach ($images as $image) {
        $pic = $image->getAttribute('src');
        # if source is empty, skip to another image
        if ( empty( $pic ) )
            continue;
        # get image absolute url
        $absUrl = url_to_absolute($pic);
        # ignore already seen images (skip to another), add new images
        if ( in_array( $absUrl, $visited ) )
            continue;
        $visited[] = $absUrl;
        # remove ads
        $ignoring = false;
        foreach($ignore as $item)
            if ( stripos( $absUrl,$item ) !== false ){

                $ignoring=true;
                break;

            }
        if ( $ignoring )
            continue;
        $imageSize = @getimagesize($absUrl);
        if ( ( $imageSize[0] * $imageSize[1] ) > $maxSize) {
            $maxSize = $imageSize[0] * $imageSize[1];
            if ($minImgWidth < $imageSize[0] && $minImgHeight < $imageSize[1])
                $biggestImage = $absUrl;
        }
    }
    return $biggestImage;
}

private function getImagesFromDom( $url ) {
    ini_set('default_socket_timeout', 4);
    $dom = new DOMDocument();
    @$dom->loadHTMLFile( $url );
    $dom->preserveWhiteSpace = false;

    # Get images from DOM
    return $dom->getElementsByTagName('img');
}
私有函数getMainImageFromUrl($pageUrl){
$biggestImage='';
$minImgWidth=300;
$minImgHeight=300;
$images=$this->getImagesFromDom($pageUrl);
$visited=array();
$maxSize=-1;
$ignore=array('ad','ads','gif');//清除广告(检查这些广告是否包含以下内容)
foreach($images作为$image){
$pic=$image->getAttribute('src');
#如果源为空,请跳到另一个图像
如果(空($pic))
继续;
#获取图像绝对url
$absUrl=url到绝对值($pic);
#忽略已看到的图像(跳到另一个),添加新图像
if(在数组中($absUrl,$visted))
继续;
$visited[]=$absUrl;
#删除广告
$忽略=错误;
foreach($ignore as$项目)
if(stripos($absUrl,$item)!==false){
$ignoring=true;
打破
}
如果($忽略)
继续;
$imageSize=@getimagesize($absUrl);
如果($imageSize[0]*$imageSize[1])>$maxSize){
$maxSize=$imageSize[0]*$imageSize[1];
如果($minImgWidth<$imageSize[0]&&$minImgHeight<$imageSize[1])
$biggestImage=$absUrl;
}
}
返回$biggestImage;
}
私有函数getImagesFromDom($url){
ini设置(“默认套接字超时”,4);
$dom=新的DOMDocument();
@$dom->loadHTMLFile($url);
$dom->preserveWhiteSpace=false;
#从DOM获取图像
返回$dom->getElementsByTagName('img');
}

@Khez,@Pekka,我的错误是
警告:reset()[function.reset]:传递的变量不是数组或对象
。对,有2个
$arr
,是我的错。@Khez,那怎么修改呢?我只想得到一个最大的图像返回。我已经尽我所能尝试过了。我需要帮助。谢谢。用绝对url函数更新你的代码,我会给你一个优化的工作版本。@Khez,我已经更新了
绝对url函数
代码
$最大的图像
就是我真正给出的。如果一个页面有两个以上同样大小的最大图像,只需回显其中一个即可。再次感谢。你实际上必须得到有问题的图像,所以这完全取决于你的连接。如果你想要原始磁盘大小而不是图像像素的最大图像,你可以欺骗系统一点,不下载任何图像,但是。。。超出你的需要。
<?php
require_once 'simple_html_dom.php';
require 'url_to_absolute.php'; //get image absolute url
// options
$url = 'http://www.yomiuri.co.jp/stream/';
$ignore = array('ad', 'ads','gif');// add ads possible words as a arry which is check in the image url
$biggestImage = 'path to "no image found" image';
// process
$maxSize = -1;
$visited = array();
$html = file_get_html($url);
// base url
$parts=parse_url($url);
$host=$parts['scheme'].'://'.$parts['host'];
// loop images
foreach($html->find('img') as $element) {
    $pic = $element->src;
    if($pic=='')continue;// it happens on your test url
    $absUrl = url_to_absolute($host, $pic);//get image absolute url
    // ignore already seen images, add new images
    if(in_array($absUrl, $visited))continue;
    $visited[]=$absUrl;
    // remove ads images
    $ignoring=false;
    foreach($ignore as $item)
        if (stripos($absUrl,$item)!==false){
            $ignoring=true;
            break;
        }
    if($ignoring)continue;
    // get image
    $image=@getimagesize($absUrl);// get the rest images width and height
    if (($image[0] * $image[1]) > $maxSize) {   
        $maxSize = $image[0] * $image[1];  //compare images' sise
        $biggestImage = $absUrl;
    }
}
echo '<img src="'.$biggestImage.'" />'; //echo the biggest one
?>
private function getMainImageFromUrl($pageUrl) {

    $biggestImage = '';
    $minImgWidth = 300;
    $minImgHeight = 300;
    $images = $this->getImagesFromDom($pageUrl);
    $visited = array();
    $maxSize = -1;
    $ignore = array('ad', 'ads','gif'); // get rid of ads (check if these contains following)

    foreach ($images as $image) {
        $pic = $image->getAttribute('src');
        # if source is empty, skip to another image
        if ( empty( $pic ) )
            continue;
        # get image absolute url
        $absUrl = url_to_absolute($pic);
        # ignore already seen images (skip to another), add new images
        if ( in_array( $absUrl, $visited ) )
            continue;
        $visited[] = $absUrl;
        # remove ads
        $ignoring = false;
        foreach($ignore as $item)
            if ( stripos( $absUrl,$item ) !== false ){

                $ignoring=true;
                break;

            }
        if ( $ignoring )
            continue;
        $imageSize = @getimagesize($absUrl);
        if ( ( $imageSize[0] * $imageSize[1] ) > $maxSize) {
            $maxSize = $imageSize[0] * $imageSize[1];
            if ($minImgWidth < $imageSize[0] && $minImgHeight < $imageSize[1])
                $biggestImage = $absUrl;
        }
    }
    return $biggestImage;
}

private function getImagesFromDom( $url ) {
    ini_set('default_socket_timeout', 4);
    $dom = new DOMDocument();
    @$dom->loadHTMLFile( $url );
    $dom->preserveWhiteSpace = false;

    # Get images from DOM
    return $dom->getElementsByTagName('img');
}