最近在做项目的时候,有个需求是需要提取页面内容中的所有的图片地址,然后进行分析。接下来吾爱编程网就为大家介绍一下php提取HTML文章中的图片地址的方法,有需要的小伙伴可以参考一下:
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怎么提取页面里图片路径方法的全部内容了,希望对大家有所帮助!