在PHP中搜索HTML文档

时间:2010-10-10 17:05:27

标签: php xpath domdocument

我正在尝试使用DOMDocument和XPath来使用PHP搜索HTML文档。我想通过诸如'022222'之类的数字进行搜索,它应该返回相应h2标签的值。有关如何做到这一点的任何想法?

可以在http://pastie.org/1211369

找到HTML文档

2 个答案:

答案 0 :(得分:2)

这个怎么样?

$sxml = simplexml_load_string($data);
$find = "022222";

print_r($sxml->xpath("//li[.='".$find."']/../../../div[@class='content']/h2"));

它返回:

Array
(
    [0] => SimpleXMLElement Object
        (
            [0] => Item 2
        )

)

//li[.='xxx']会找到您搜索的li。然后我们使用../升级三个级别,然后我们按照div[@class='content']的指定进入content-div。最后我们选择了h2孩子。

仅供参考,以下是使用DOM的方法:

$dom = new DOMDocument();
$dom->loadXML($data);

$find = "022222";

$xpath = new DOMXpath($dom);
$res = $xpath->evaluate("//li[.='".$find."']/../../../div[@class='content']/h2");

if ($res->length > 0) {
    $node = $res->item(0);
    echo $node->firstChild->wholeText."\n";
}

答案 1 :(得分:2)

I want to search by a number such as '022222', and it should return the value of the corresponding h2 tag. Any thoughts on how this would be done?

The HTML document can be found at http://pastie.org/1211369

首先,provided link上的文字不是格式良好的XML 或XHtml文档,无法使用XPath直接解析。

因此我将其包装在<html>元素中。

在此XML文档中,一个选择了所需文本节点的XPath表达式是

/*/div[div/ul/li = '022222']/div[@class='content']/h2/text()

除了其他优点之外,这个XPath表达式不使用任何反向轴,因此更具可读性。

评估此XPath表达式的完整XML文档如下:

<html>
 <div class="item">
    <div class="content"><h2>Item 1</h2></div>
    <div class="phone">
        <ul class="phone-single">
            <li>01234 567890</li>
        </ul>
    </div>
 </div>

 <div class="item">
    <div class="content"><h2>Item 2</h2></div>
    <div class="phone">
        <ul class="phone-multiple">
        <li>022222</li>
            <li>033333</li>
        </ul>
    </div>
 </div>

 <div class="item">
    <div class="content"><h2>Item 3</h2></div>
    <div class="phone">
        <ul class="phone-single">
            <li>02345 678901</li>
        </ul>
    </div>
 </div>

 <div class="item">
    <div class="content"><h2>Item 4</h2></div>
    <div class="phone">
        <ul class="phone-multiple">
            <li>099999999</li>
            <li>088888888</li>
        </ul>
    </div>
 </div>
</html>