我从数据库中获取了一些段落,并尝试将段落分成带有正则表达式和不同类的数组。但没有任何作用。
我试着这样做:
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;
}
我更喜欢第二种方式..但它也不能很好地运作..
答案 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 modifiers:m
表示多行,s
表示.
可以匹配行结束,i
表示不区分大小写。