2

私はデータベースからいくつかの段落を取得し、それらの段落を正規表現と異なるクラスの配列に分離しようとしていますが、何も機能しません。

私はこれをやろうとしました:

   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

キャッチ可能な致命的なエラー:20行目のC:\ Inetpub \ vhosts \ bestcamdirectory.com \ httpdocs \ sandbox \ model \ ReviewContentExtractor.phpで、クラスDOMElementのオブジェクトを文字列に変換できませんでした

メッセージが表示されるのはなぜですか。文字列からすべての段落を抽出する簡単な方法はありますか?

アップデート:

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

私は2番目の方法を好みます..しかし、それもうまくいきません..

4

1 に答える 1

4

DOMDocument::getElementsByTagNameは反復可能ですが配列ではない DOMNodeList オブジェクトを返します。variabl は DOMElement のインスタンスforeachあるため、単純に文字列として使用しても機能しません (エラーで説明されているように)。$paragraph

必要なのは、DOMElement のテキスト コンテンツです。これは、それらのtextContentプロパティを通じて利用できます (DOMNode クラスから継承されます)。

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 のエラー処理部分を参照してください。

編集

あなたは正規表現を主張しているので、それを行う方法は次のとおりです。

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

パターン修飾子:m複数行をs意味し、大文字と小文字を区別しないため.に、行末に一致させることができることを意味します。i

于 2012-08-07T06:22:02.913 に答える