使用特定标题</p>从HTML <p>中提取文本

时间:2014-10-21 11:02:57

标签: php html dom html-parsing domdocument

我有一个包含大量条目的大文件,它们有一个共同点,第一行
我想从第一行的段落中提取所有文本:

  

文件类型:合同通知

我正在处理的HTML代码在这里:

<!-- other HTML -->
    <p>
      <b>Type of document:</b>
      " Contract Notice" <br>
      <b>Country</b> <br>
      ... rest of text ...
    </p>
<!-- other HTML -->

我已将HTML放入DOM这样:

$dom = new DOMDocument;    
$dom->loadHTML($content);

我需要返回段落节点中所有文本,其中第一行是'文档类型:合同通知'
我确信有一种简单的方法可以做到这一点使用DOM方法或XPath,请提供建议!

3 个答案:

答案 0 :(得分:2)

说到XPath,请尝试以下选择<p>元素的表达式:

  • <b>子元素(第一个)具有值Type of document:
    • 其下一个兄弟文本节点(第一个)包含文本Contract Notice
//p[
    b[1][.="Type of document:"]
        /following-sibling::text()[1][contains(., "Contract Notice")]
]

答案 1 :(得分:0)

使用此XPath表达式,您可以选择p元素的所有子项的文本:

//b[text()="Type of document:"]/parent::p/*/text()

答案 2 :(得分:0)

我不喜欢使用DomDocument解析,除非我需要大量解析文档,但如果你想这样做,那么它可能是这样的:

//Using DomDocument
$doc = new DOMDocument();
$doc->loadHTML($content);
$xpath = new DOMXpath($doc);
$matchedDoms = $xpath->query('//b[text()="Type of document:"]/parent::p//text()');
$data = '';

foreach($matchedDoms as $domMatch) {
    $data .= $domMatch->data . ' ';
}

var_dump($data);

我更喜欢一个简单的正则表达式行,毕竟它只是你要找的文件的一部分:

//Using a Regular Expression
preg_match('/<p>.*<b>Type of document:<\/b>.*Contract Notice(?<data>.*)<\/p>/si', $content, $matches);

var_dump($matches['data']); //If you want everything in there
var_dump(strip_tags($matches['data'])); //If you just want the text