ラボ > PHP:HTML、Javascript絡み、DOM関連

html、タグのパース(DOMDocumentとsimplexml_load_string())

単純なタグをパースしたかった

作成日:2019-01-10, 更新日:2020-10-26

HTMLをマルっとパース

HTMLをマルっとパース。個人的にはあまり使わないので未調査

$source = file_get_contents(〇〇〇);

// 文字コードの指定が正しいのに、文字化けを起こす→対応:libxml_use_internal_errors()、libxml_clear_errors()
$domDocument = new DOMDocument();
libxml_use_internal_errors(true);
$domDocument->loadHTML($source);
libxml_clear_errors();
$xmlString = $domDocument->saveXML();

// XMLをパース
$xmlObject = simplexml_load_string($xmlString);

// 連想配列化
$aryDom = json_decode(json_encode($xmlObject), true);

HTMLタグをパース

・タグを単体でパースしようとすると文字化けを起こす→utf8の指定を追記
・タグ単体だと「head」や「body」で囲まれて、あとで取り出すのが面倒→無理やり「body」内の「xxx」に放り込む形でいく

function tagParse($tag='') {
  // 文字化け対策+後で抜き出すように調整
  $utf8 = '<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>';
  $tmpTag = $utf8 . '<body><xxx>' . $tag . '</xxx></body>';
  
  // HTMLをXMLとして適切に整形
  $domDocument = new DOMDocument();
  libxml_use_internal_errors( true );
  $domDocument->loadHTML($tmpTag);
  libxml_clear_errors();
  $xmlString = $domDocument->saveXML();
  
  // XMLをパース
  $xmlObject = simplexml_load_string($xmlString);
  
  // 連想配列化
  $aryDom = json_decode(json_encode($xmlObject), true);
  
  if ( is_array($aryDom) && isset($aryDom['body']) && isset($aryDom['body']['xxx']) ) {
    return $aryDom['body']['xxx'];
  }
  else {
    return $aryDom;
  }
}