首页 > 其他分享 >获取HTML字符串中的图片地址类

获取HTML字符串中的图片地址类

时间:2023-01-29 17:44:16浏览次数:51  
标签:false length num else blacklist 地址 HTML imgSrcArr 字符串

<?php

// +----------------------------------------------------------------------
// | 获取HTML字符串中的图片地址类
// +----------------------------------------------------------------------

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 (false === $blacklist || strpos($imgSrc, $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 (false === $blacklist || strpos($imgSrc, $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 (false === $blacklist || strpos($img1[2][0], $blacklist) === false) {
                        $imgSrcArr[] = $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;
            }
        }
    }
}

 

标签:false,length,num,else,blacklist,地址,HTML,imgSrcArr,字符串
From: https://www.cnblogs.com/zhangxilong/p/17073377.html

相关文章

  • HTML5
    新增的标签语义化标签header头部标签nav导航标签article内容标签section定义文档的某个区域aside侧边栏标签footer尾部标签上面的标签都是语义化标签,没有......
  • 题目:字符串排序
    实现一个函数,输入为一个字符串只包含a-z,返回字符串中出现次数最多的字符及其出现次数,如果有出现同样次数的,则返回在字符串中位置更靠前的#include<stdio.h>intget_max_......
  • IPv6之地址配置
      也即undoipv6nd,rahalt   ......
  • HTML笔记
    DOCTYPE用来声明文档类型,作用就是告诉浏览器使用那种HTML版本来显示网页,必须写在文件第一行<!DOCTYPEhtml>html标签属性lang用来定义当前文档的语言<htmllan......
  • sql中某一个字段内容为用逗号分割的字符串转换成多条数据
    场景:表名:testsueridname1小红,小李,李红,小法要结果值为:1小红1小李1李红1小法MYSQL函数解释:substring_index(str,delim,count)......
  • IPv6之EUI-6地址生成 方式
               ......
  • 使用 JavaScript 从字符串中提取数字
    在JavaScript中,有多种方法可以从字符串中提取数字。一种方法是使用 match() 方法和正则表达式来搜索字符串中的所有数字。另一种方法是使用 replace() 方法和正则表达式从......
  • php代码:判断一个html字符串标签不闭合(没有结束标记)
    来源代码记录一个php的html标签自动闭合的函数代码<?phpfunctionfix_html_tags($input,$single_tags=array()){$result=null;$stack=array();//标......
  • 在圣诞及元旦的日子里如何用html代码画一个爱心树
    一、前言在圣诞节以及元旦节日来临的日子里,如果能亲自为自己所爱的人画一个爱心树,这肯定是个很浪漫的事。那么如何用代码画出圣诞树呢?用我的办法就能很简单的实现,复制-粘贴-......
  • 如何用最简单的方法用html代码画出圣诞树
    一、前言在圣诞节以及元旦节日来临的日子里,如果能亲自为自己所爱的人画一个圣诞树,这肯定是个很浪漫的事。那么如何用代码画出圣诞树呢?用我的办法就能很简单的实现,复制-粘贴-......