获取字符串提取中的所有段落

时间:2012-08-07 06:15:15

标签: php

我从数据库中获取了一些段落,并尝试将段落分成带有正则表达式和不同类的数组。但没有任何作用。

我试着这样做:

   public function get_first_para(){
        $doc = new DOMDocument();
    $doc->loadHTML($this->review);
    foreach($doc->getElementsByTagName('p') as $paragraph) {
      echo $paragraph."<br/><br/><br/>";
    } 
 }

但我明白了:

Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: Unexpected end tag : p in Entity, line: 9 in C:\Inetpub\vhosts\bestcamdirectory.com\httpdocs\sandbox\model\ReviewContentExtractor.php on line 18

捕获致命错误:DOMElement类的对象无法在第20行的C:\ Inetpub \ vhosts \ bestcamdirectory.com \ httpdocs \ sandbox \ model \ ReviewContentExtractor.php中转换为字符串

为什么我收到消息,是否有一种简单的方法从字符串中提取所有段落?

更新

   public function get_first_para(){
         $pattern="/<p>(.+?)<\/p>/i";
         preg_match_all($pattern,$this->review,$matches,PREG_PATTERN_ORDER);
         return $matches;
     }

我更喜欢第二种方式..但它也不能很好地运作..

1 个答案:

答案 0 :(得分:3)

DOMDocument::getElementsByTagName返回一个可迭代但不是数组的DOMNodeList对象。在foreach中,$paragraph变量是DOMElement的基准,因此只需将其用作字符串就不起作用(正如错误所解释的那样)。

你想要的是DOMElement的文本内容,它可以通过那些(继承自DOMNode类)的textContent属性获得:

foreach($doc->getElementsByTagName('p') as $paragraph) {
  echo $paragraph->textContent."<br/><br/><br/>"; // for text only
} 

或者,如果您需要DOMNode的完整内容,可以使用DOMDocument::saveHTML

foreach($doc->getElementsByTagName('p') as $paragraph) {
    echo $doc->saveHTML($paragraph)."<br/><br/><br/>\n"; // with the <p> tag

    // without the <p>
    // if you don't need the containing <p> tag, you can iterate trough it's childs and output them
    foreach ($paragraph->childNodes as $cnode) {
         echo $doc->saveHTML($cnode); 
    }
}

至于你的loadHTML错误,html输入无效,你可以用以下内容来禁止警告:

libxml_use_internal_errors(true); // before loading the html content

如果您需要这些错误,请参阅手册的libxml's error handling part

修改

因为你坚持使用正则表达式,所以你可以这样做:

preg_match_all('!<p>(.+?)</p>!sim',$html,$matches,PREG_PATTERN_ORDER);

pattern modifiersm表示多行,s表示.可以匹配行结束,i表示不区分大小写。