php xpath - 只获取标记属性/删除内部标记内容

时间:2009-05-02 09:07:38

标签: php

我如何:

  1. 隐藏xpath“/ html / head”查询中头标记之间的所有内容?
  2. 例如在“<html><head><title>some title</title>some text</head> ...”上会产生nodeValue =“某些标题某些文本”,这是无关紧要的,因为我只需要标记属性,而不需要向我的数据库添加无关数据。

    1. 隐藏xpath“/ html / body”查询中的所有子/后代节点?
    2. 例如在“<html><body><div>some anchor</div>some text</body> ...”上会产生nodeValue =“某些锚定一些文本”“某些文本”与正文标记相关,我确实需要保留它并获取其他所有内容。

      此外,我不想完全从dom文档中删除它们!

3 个答案:

答案 0 :(得分:2)

  

这是无关紧要的,因为我只需要标签属性

我不确定您的示例中的属性在哪里。我不是PHP xpath实现专家。

但是,您可以尝试以下方法:

  • 使用表达式末尾的text() xpath函数(例如"/html/head/text()")来获取文本节点,而不是标记
  • xpath函数应返回NodeList。您应该使用它来获取整个片段XML - 例如DOMXpath就是这么做的。

答案 1 :(得分:1)

在这种情况下,也许像你这样的preg_match可能就是你所需要的?

preg_match( '/<head (.*)>/', $file_contents, $matches );
echo ( isset( $matches[1] ) ) ? $matches[1] : '';

答案 2 :(得分:0)

修改: 关于head元素 - 你只想获得head元素的属性,你可以使用xpath(“// head”)and then $head->attributes

我不会直接回答你的问题,这个问题不是很详细,但我宁愿讲一个关于我自己经历的故事。如果您了解我给出的示例的含义,我相信您可以解决您的问题。

我从标签中了解到你想在工作中使用PHP。我最近遇到了类似的问题,我必须解析大约100个静态html文档,并提取部分信息以将其放入数据库中。最初我考虑过正则表达式,但随着我的进展,我发现这将是一项繁琐的工作。

所以我最终弄乱了PHP中的XPath和SimpleXML。

以下是我的结局:

$file_contents = file_get_contents( $file );
$dom = new DOMDocument;
$dom->loadHTML( $file_contents );
$document = simplexml_import_dom( $dom );

现在我有一个包含HTML代码的SimpleXML对象。这真的很棒 - 这就是它如何滚动:

假设您有以下HTML代码:

<div id="content">
<div class="description">
    <dl>
        <dt>Title</dt>
        <dd>
            <ul><li> first item </li> <li> second item</li></ul>
            <p> a paragraph.. </p>
        </dd>
    </dl>
</div>
</div>

现在,您可以遍历所有&lt; dl&gt;你的代码中的元素,它们是div#description的子元素和div#的内容,就像那样:

foreach( $document->xpath( "//div[@id='content']/div[@class='description']/dl" ) as $element )

然后通过像这样的递归函数解析所有子节点:

function recurse( $parent )
{
echo '<' . $parent->getName() . '>' . "\n";
#echo $parent # you might want to strip any white spaces like \t and \n here

foreach( $parent->children() as $child )
{
    if( count( $child->children() ) > 0 )
    {
        recurse( $child );
    }
    else
    {
       echo '<' . $child->getName() . '>';
       echo $child;
       echo '</' . $child->getName() . '>' . "\n";
    }
}
echo '</' . $parent->getName() . '>' . "\n";
}

我希望我得到了帮助,祝你好运!