php怎么提取页面里图片路径

2024-10-30 08:28:00     浏览次数:7

最近在做项目的时候,有个需求是需要提取页面内容中的所有的图片地址,然后进行分析。接下来吾爱编程网就为大家介绍一下php提取HTML文章中的图片地址的方法,有需要的小伙伴可以参考一下:

php怎么提取页面里图片路径

1、方法思路:

通过判断是否包含img标签来进行截取,在进行进一步的进行图片地址提取

2、程序方法类:

<?php
/**
 * Created by biancheng123.
 * User: jason
 * Date: 2024/10/25
 * Time: 13:16
 */
class GetImgSrc{
    /**
     * 提取HTML文章中的图片地址
     * @param string $data HTML或者文章
     * @param int $num 第 $num 个图片的src,默认为第一张
     * @param string $order 顺取倒取; 默认为 asc ,从正方向计数。 desc 从反方向计数
     * @param string|array $blacklist 图片地址黑名单,排除图片地址中包含该数据的地址;例如 传入 baidu.com  会排除 src="http://www.baidu.com/img/a.png"
     * @param string $model 默认为字符串模式;可取值 string  preg;string模式处理效率高,PHP版本越高速度越快,可比正则快几倍
     * @return false| null | src  当data为空时返回 false , src不存在时返回 null ,反之返回src
     */
    public static function src($data, $num = 1, $order = 'asc', $blacklist = false, $model = 'string'){
        if(isset($data)){
            if($model === 'preg'){
                $imgSrc = self::pregModel($data, $num-1, $order);
            }else{
                $imgSrc = self::strModel($data, $num, $order);
            }
            if($blacklist === false){
                return $imgSrc;
            }else{
                if(is_array($blacklist)){
                    foreach($blacklist as $value){
                        if(strpos($imgSrc, $value) !== false){
                            return self::src($data, $num+1, $order, $blacklist, $model);
                        };
                    }
                    return $imgSrc;
                }else{
                    if($blacklist === false || strpos($imgSrc, (string)$blacklist) === false){
                        return $imgSrc;
                    }else{
                        return self::src($data, $num+1, $order, $blacklist, $model);
                    }
                }
            }
        }else{
            return false;
        }
    }
    /**
     * 提取HTML文章中的图片地址
     * @param string $data HTML或者文章
     * @param int $startNum 默认为1,从第一张图片开始抽取
     * @param int $length 从 $startNum 开始抽取,共抽取 $length 张;默认为0,为0则抽取到最后
     * @param string $order 顺取倒取; 默认为 asc ,从正方向计数。 desc 从反方向计数
     * @param string|array $blacklist 图片地址黑名单,排除图片地址中包含该数据的地址;例如 传入 img.baidu.com  会排除 src="img.baidu.com/a.png"
     * @param string $model 抽取集合时,默认为正则模式;可选模式:preg  string,当 $length > 3 或者 $length = 0时,强制使用正则模式,因为取的数量大时,正则速度更快。
     * @return array 图片地址的集合数组,若无则返回空数组
     */
    public static function srcList($data, $startNum = 1, $length = 0, $order = 'asc', $blacklist = false, $model = 'preg'){
        if($model === 'preg' || $length > 3 || $length === 0){
            $imgSrcArr = self::pregModel($data, [$startNum-1, $length, $blacklist], $order);
        }else{
            $imgSrcArr = [];
            for($i=$startNum; $i<$startNum+$length; $i++){
                $imgSrc = self::strModel($data, $i, $order);
                if(is_array($blacklist)){
                    $blackBool = true;
                    foreach ($blacklist as $k=>$v){
                        if (strpos($imgSrc, $blacklist) !== false) {
                            $blackBool = false;
                        }
                    }
                    if($blackBool){
                        $imgSrcArr[] = $imgSrc;
                    }else{
                        $length++;
                    }
                }else{
                    if ($blacklist === false || strpos($imgSrc, (string)$blacklist) === false) {
                        $imgSrcArr[] = $imgSrc;
                    }else{
                        $length++;
                    }
                }
            }
        }
        return $imgSrcArr;
    }
    /**
     * @param $str
     * @param $num
     * @param $order
     * @return bool|string|null
     */
    public static function strModel($str, $num, $order){
        $topStr = null;
        if($order != 'asc'){
            $funcStr = 'strrpos';
        }else{
            $funcStr = 'strpos';
        }
        for($i=1; $i<=$num; $i++){
            $firstNum = $funcStr($str, '<img');
            if($firstNum !== false){
                if($order != 'asc'){
                    $topStr = $str;
                    $str = substr($str, 0, $firstNum);
                }else{
                    $str = substr($str, $firstNum+4);
                }
            }else{
                return null;
            }
        }
        $str = $order=='asc'?$str:$topStr;
        $firstNum1 = $funcStr($str, 'src=');
        $type = substr($str, $firstNum1+4, 1);
        $str2 = substr($str, $firstNum1+5);
        if($type == '\''){
            $position = strpos($str2, "'");
        }else{
            $position = strpos($str2, '"');
        }
        $imgPath = substr($str2, 0, $position);
        return $imgPath;
    }
    /**
     * @param $str
     * @param $num
     * @param $order
     * @return string|array|null
     */
    public static function pregModel($str, $num, $order){
        preg_match_all("/<img.*>/isU", $str, $ereg);
        $img = $ereg[0];
        if($order != 'asc'){
            $img = array_reverse($img);
        };
        if(is_array($num)){
            $startNum = $num[0];
            $length = $num[1];
            $blacklist = $num[2];
            $imgSrcArr = [];
            foreach($img as $key=>$value){
                $imgSrc = $value;
                $pregModel='/src=(\'|")(.*)(?:\1)/isU';
                preg_match_all($pregModel, $imgSrc, $img1);
                if(is_array($blacklist)){
                    $blacklistBool = true;
                    foreach($blacklist as $v){
                        if(strpos($img1[2][0], $v) !== false){
                            $blacklistBool = false;
                        };
                    }
                    if($blacklistBool){
                        $imgSrcArr[] = $img1[2][0];
                    };
                } else {
                    if ($blacklist === false || strpos($img1[2][0], (string)$blacklist) === false) {
                        if (isset($img1[2][0])) {
                            //$imgSrcArr[] = $img1[2][0] ?? "";
                            $imgSrcArr[] = isset($img1[2][0]) ? $img1[2][0] : "";
                        }
                    };
                }
            }
            if($length > 0){
                return array_slice($imgSrcArr, $startNum, $length);
            }else{
                return array_slice($imgSrcArr, $startNum);
            }
        }else{
            if(!empty($img[$num])){
                $imgStr = $img[$num];
                $pregModel='/src=(\'|")(.*)(?:\1)/isU';
                preg_match_all($pregModel, $imgStr, $img1);
                return $img1[2][0];
            }else{
                return null;
            }
        }
    }
}
?>

3、使用方法:

 <?php
include 'GetImgSrc.class.php';//引入上述类文件
$str = '这里是普通文字这里是干扰元素测试\'\'"""';

$src = GetImgSrc::srcList($str, 2, 3, 'asc', false, 'string');
$src2 = GetImgSrc::src($str, 1, 'asc', false, 'string');

var_dump($src);
var_dump($src2);


以上就是吾爱编程网为大家介绍的关于php怎么提取页面里图片路径方法的全部内容了,希望对大家有所帮助!

返回PHP教程列表