You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
information-system/application/libraries/html_optimize_lib.php

149 lines
5.7 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
/*
* HTML的优化处理的类库
*/
class html_optimize_lib
{
var $CI;
public function __construct()
{
$this->CI = &get_instance();
$this->CI->load->model('Information_model');
$this->CI->load->model('InfoMetas_model');
$this->CI->load->library('simple_html_dom_lib');
}
//开启了延迟加载
public function set_lazy_loader($html, $grey_pic)
{
$html_object = str_get_html($html);
foreach ($html_object->find('img') as $image) {
$img_src = $image->src;
/**有些图片不需要延迟加载比如头部第一张图延迟加载会影响CLS的评分所以图片加loader="nolazy"属性就可以不用替换为延迟加载代码。 */
$loader = $image->loader;
if (!empty($loader) && $loader == "nolazy") {
continue;
}
/** 无需延迟加载结束 20210527 zp */
if (!empty($image->originalsrc)) {
$img_src = $image->originalsrc;
}
$image->src = $grey_pic;
$image->loader = 'lazy';
$image->originalsrc = $img_src;
}
return $html_object->save();
}
//获取图片尺寸,$lazy_loader是否开启延迟加载
public function set_image_size($html)
{
$html_object = str_get_html($html);
//拼接图片链接,获取尺寸
$request_size = array();
foreach ($html_object->find('img') as $image) {
$img_src = $image->src;
if (!empty($image->originalsrc)) {
$img_src = $image->originalsrc;
}
//图片已经设置了尺寸的不再修改
if (empty($image->width) && (strpos($img_src, '//data.') !== false || strpos($img_src, '//images.') !== false)) {//以data或者images开头的域名才能获取尺寸
$img_src_urls = parse_url(trim($img_src));
$request_size[$img_src_urls['host']][] = $img_src_urls['path'];
}
}
//请求图片尺寸
$image_sizes = array();
foreach ($request_size as $host => $path) { //拼接的URL有长度限制大量的图片一次性请求就会失败需要分批处理
$parse_url = "https://{$host}/imagesize.php?photo=" . implode(',', $path);
$size_data = GET_HTTP($parse_url);
if (!empty($size_data)) {
$size_data = json_decode($size_data);
foreach ($size_data as $size_item) {
$size_item->photo = "https://" . $host . $size_item->photo;//这个作为索引找到对应url的尺寸
$image_sizes[$size_item->photo] = $size_item;
}
}
}
//print_r($request_size);
//print_r($image_sizes);
//把尺寸写入html内容中
foreach ($html_object->find('img') as $image) {
$img_src = $image->src;
if (!empty($image->originalsrc)) {
$img_src = $image->originalsrc;
}
//图片已经设置了尺寸的不再修改
if (empty($image->width) && (strpos($img_src, '//data.') !== false || strpos($img_src, '//images.') !== false)) {//以data或者images开头的域名才能获取尺寸
$img_src_urls = parse_url(trim($img_src));
$img_index = "https://" . $img_src_urls['host'] . $img_src_urls['path'];
if (!empty($image_sizes[$img_index])) {
$image->width = $image_sizes[$img_index]->width;
$image->height = $image_sizes[$img_index]->height;
}
}
}
return $html_object->save();
}
//获取图片尺寸的本地版本,图片存在相同服务器上,速度比较快
//$dataPath data文件夹本地路径
//$imagesPath images文件夹本地路径
public function set_image_size_local($html, $dataPath, $imagesPath)
{
$html_object = str_get_html($html);
foreach ($html_object->find('img') as $image) {
$img_src = $image->src;
if (!empty($image->originalsrc)) {
$img_src = $image->originalsrc;
}
//图片已经设置了尺寸的不再修改
if (empty($image->width) && (strpos($img_src, '//data.') !== false || strpos($img_src, '//images.') !== false)) {//以data或者images开头的域名才能获取尺寸
$img_src_urls = parse_url(trim($img_src));
$request_size[$img_src_urls['host']][] = $img_src_urls['path'];
$file_path = '';
if (strpos($img_src, '//data.') !== false) {
$file_path = $dataPath . $img_src_urls['path'];
}
if (strpos($img_src, '//images.') !== false) {
$file_path = $imagesPath . $img_src_urls['path'];
}
if (is_file($file_path)) {
$properties = getimagesize($file_path);//获取图片属性读取失败返回false
if ($properties && !empty($properties[0]) && !empty($properties[1])) {
$image->width = $properties[0];
$image->height = $properties[1];
}
}
}
}
return $html_object->save();
}
///查询html的标签然后后面添加新html
public function add_htmlcode($html,$findTag,$addHtml){
$html_object = str_get_html($html);
$findE = $html_object->find($findTag,0);
$findE->outertext = $findE->outertext . $addHtml ;
return $html_object->save();
$html_object->clear();
}
}