Php html解析,我想将解析后的元素保存到数组

时间:2017-09-11 06:07:08

标签: php html parsing

我试图解析html页面并访问某些标签。我正在解析所有这些标签并以缩进的形式显示结果,该缩进根据标签的级别,例如标题标签h1,h2,h3等。现在,我想将结果数据(缩进的目录)与标签名称一起保存到数组中。请帮助我理清我的问题。

这是我的PHP代码......我使用的是html dom解析器。

include ("simple_html_dom.php");
session_start();
error_reporting(0);
$string = file_get_contents('test.php');

$tags = array(0 => '<h1', 1 => '<h2', 2 => '<h3', 3 => '<h4', 4 => '<h5', 5 => '<h6');

function parser($html, $needles = array()){
    $positions = array();
    foreach ($needles as $needle){
        $lastPos = 0;
        while (($lastPos = strpos($html, $needle, $lastPos))!== false) 
        {
            $positions[] = $lastPos;
            $lastPos = $lastPos + strlen($needle);
        }

        unset($needles[0]);
        if(count($positions) > 0){
            break;
        }
    }

    if(count($positions) > 0){
        for ($i = 0; $i < count($positions); $i++) {
            ?>
            <div class="<?php echo $i; ?>" style="padding-left: 20px; font-size: 14px;">
            <?php

            if($i < count($positions)-1){
                $temp = explode('</', substr($html, $positions[$i]+4));
                $pos = strpos($temp[0], '>');
                echo substr($temp[0], $pos);
                parser(substr($html, $positions[$i]+4, $positions[$i+1]-$positions[$i]-4), $needles);
            } else {
                $temp = explode('</', substr($html, $positions[$i]+4));
                $pos = strpos($temp[0], '>');
                echo substr($temp[0], $pos+1);
                parser(substr($html, $positions[$i]+4), $needles);
            }

            ?>
            </div>

            <?php
        }
    } else {
        // not found any position of a tag
    }
}
parser($string, $tags);

1 个答案:

答案 0 :(得分:0)

如果您想使用SimpleXML和XPath来实现它,那么您可以尝试使用更短且更易读的版本...

$xml = new SimpleXMLElement($string);
$tags = $xml->xpath("//h1 | //h2 | //h3 | //h4");
$data = [];
foreach ( $tags as $tag )   {
    $elementData['name'] = $tag->getName();
    $elementData['content'] = (string)$tag;
    $data[] = $elementData;
}

print_r($data);

您可以在XPath中看到模式 - 它结合了您需要的任何元素。 //的使用意味着在任何级别找到您想要查找的元素的名称。这些是使用|组合的,这是&#39;或&#39;运营商。这可以使用相同类型的表达式轻松扩展,以构建您需要的完整标记集。

程序然后遍历找到的元素并一次构建每个元素的数组。获取名称和内容并将它们添加到$ data数组中。

更新: 如果您的文件不是格式良好的XML,则可能必须使用DOMDocument和loadHTML。只有轻微的差异,但更容易出错...

$string = file_get_contents("links.html");
$xml = new DOMDocument();
libxml_use_internal_errors();
$xml->loadHTML($string);
$xp = new DOMXPath($xml);
$tags = $xp->query("//h1 | //h2 | //h3 | //h4");
$data = [];
foreach ( $tags as $tag )   {
    $elementData['name'] = $tag->tagName;
    $elementData['content'] = $tag->nodeValue;
    $data[] = $elementData;
}

print_r($data);