我试图解析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);
答案 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);