Simple HTML DOM Parser 子要素を取り除く

2011/06/27

ちょっと説明しづらいんだけど、子要素もまとめて取得するのでどうにかしたい。
要は下記のようにしたい。

対象:
<div>あ<div>い</div>う</div>
<div>か<div>き</div>く</div>
↓↓↓
(通常「plaintext」)出力結果:
あいう

かきく

(希望「plaintext」)出力結果:
あいう
かきく

対策案

他に良い方法があるかもしれないけど、現状の私のスキルでは下記が限界。
※子要素は平気だけど孫要素は対応できない。現状、そこまで対応する必要ないし…どうすれば良いかもわかんないし。

  1. とりあえず、「outertext」を取得。
  2. 親要素内に子要素が含まれるなら削除。
  3. 残った要素のみ値を取得

基本的には上記のようなこんな感じ。具体的には下記。

  1. // DOM化したものから「div」取得
  2. $node = $dom->find("div");
  3.  
  4. // とりあえず「outertext」を取得
  5. foreach( $node as $v ){
  6.  $all[] = $v->outertext;
  7. }
  8.  
  9. // 親要素の番号を取得
  10. for( $i=0; $i<count($all); $i++ ){
  11.  if( $i === 0){
  12.   $compare = $all[$i];
  13.   $reps[] = $i;
  14.  }else{
  15.   $j = count($reps) – 1;
  16.   // 一つ前の「outertext」内に含まれるかチェック
  17.   if( !strstr( $compare, $all[$i] ) ){
  18.    $compare = $all[$i];
  19.    $reps[] = $i;
  20.   }else{
  21.    $pattern = "/" . $all[$i] . "/u";
  22.    $compare = preg_replace($pattern, "", $compare);
  23.   }
  24.  }
  25. }
  26.  
  27. // 必要な親要素のみ取得
  28. foreach( $reps as $v ){
  29.  $arys[] = $node[$v];
  30. }
  31.  
  32. // 必要なものを取得:例えば「plaintext」を取得
  33. foreach( $arys as $v ){
  34.  $plaintext[] = $v->plaintext;
  35. }

DOM化し、とりあえず全部タグごと取得

「1~7行目」でタグごと(outertext)取得する。

$all:
[0] <div>あ<div>い</div>う</div>
[1] <div>い</div>
[2] <div>か<div>き</div>く</div>
[3] <div>き</div>

親要素の番号を取得

上記でいうと「0」と「2」が欲しい。
「9~25行目」で番号を取得する。

とりあえず[0]を一時保存($compare)。

「$compare」に[1]が含まれるかチェック。
含まれるから「$compare」から[1]を削除したものを一時保存($compare)。

次に「$compare」に[2]が含まれるかチェック。
含まれないから番号($i)を取得。
以下、ループ。

$reps:
[0] 0
[1] 2

必要な親要素のみ取得

「27~30行目」で必要な親要素のみにする。
必要な親要素は「$node」の番号が「$reps」のみ。

好きな値を取得する

「32~35行目」で好きにする。
今回は「plaintext」を取得する。

$plaintext:
[0] あいう
[1] かきく

課題

孫要素まであった場合は問題が発生する。

問題なし(子要素まである):
<div>あ<div>い</div>う</div>

問題あり(孫要素まである):
<div>あ<div>い<div>え</div></div>う</div>

新着(ニュース関連以外)

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい