php通过正则提取页面相关信息

2023-05-11 16:10:43 浏览数 (1)

1、获取页面标题

代码语言:javascript复制
//提取标题
preg_match('/<title>(?<title>.*?)</title>/i', $html, $titleArr);
$title = $titleArr['title'];

2、获取body主体内容,并将背景图片提取出来替换成其他图片地址

代码语言:javascript复制
/**
 * 获取BODY主体区域内容
 * @param $html
 * @param $urlRoot
 * @return mixed
 */
function getBody($html,$urlRoot = null){
    //提取BODY主体
    preg_match('/<!--body-->(.*?)<!--body-->/is ', $html, $bodyArr);
    if(!$bodyArr){
        preg_match('/<body.*?>(.*?)</body>/is ', $html, $bodyArr);
    }
    $body = $bodyArr[1];
    //替换img文件
    $body =  preg_replace('/(<[img|IMG].*src=['|"])(../)*(img.[^'||^"] )/',"$1$urlRoot$3",$body);
    //替换html文件内的css背景图片
    $body =  preg_replace('~b(background(-image)?s*:(.*?)(s*['|"]?)(../)*(img.*?)?s*)~i',"$1$urlRoot$5)",$body);
    return $body;
}

3、提取页面Description内容

代码语言:javascript复制
function getDescription($html){
    // Get the 'content' attribute value in a <meta name="description" ... />
    $matches = array();

    // Search for <meta name="description" content="Buy my stuff" />
    preg_match('/<meta.*?name=("|')description("|').*?content=("|')(.*?)("|')/i', $html, $matches);
    if (count($matches) > 4) {
        return trim($matches[4]);
    }

    // Order of attributes could be swapped around: <meta content="Buy my stuff" name="description" />
    preg_match('/<meta.*?content=("|')(.*?)("|').*?name=("|')description("|')/i', $html, $matches);
    if (count($matches) > 2) {
        return trim($matches[2]);
    }

    // No match
    return null;
}

4、替换css文件的背景图片地址

代码语言:javascript复制
/**
 * 获取CSS内容
 * @param $cssCnt
 * @param $urlRoot
 * @return mixed
 */
function getCss($cssCnt,$urlRoot =null){
    //匹配包含 img文件夹的相对路径图片 (含义绝对路径的不包含在其中)
    //匹配替换不一定准确,因为只是将 含义 ../ 的地址转为url 而没有考虑 ../../ 之类的层级关系
    $css =  preg_replace('~b(background(-image)?s*:(.*?)(s*['|"]?)(../)*(img.*?)?s*)~i',"$1$urlRoot$5)",$cssCnt);
    //添加css前缀
    $css =  preg_replace('/b.(.*?)[,|{]/',"pat .$0",$cssCnt);
    //TODO 压缩css
    return $css;
}

0 人点赞