Simple HTML DOM Parser 子要素を取り除く
2011/06/27
ちょっと説明しづらいんだけど、子要素もまとめて取得するのでどうにかしたい。
要は下記のようにしたい。
対象:
<div>あ<div>い</div>う</div>
<div>か<div>き</div>く</div>
↓↓↓
(通常「plaintext」)出力結果:
あいう
い
かきく
き
<div>あ<div>い</div>う</div>
<div>か<div>き</div>く</div>
↓↓↓
(通常「plaintext」)出力結果:
あいう
い
かきく
き
(希望「plaintext」)出力結果:
あいう
かきく
対策案
他に良い方法があるかもしれないけど、現状の私のスキルでは下記が限界。
※子要素は平気だけど孫要素は対応できない。現状、そこまで対応する必要ないし…どうすれば良いかもわかんないし。
- とりあえず、「outertext」を取得。
- 親要素内に子要素が含まれるなら削除。
- 残った要素のみ値を取得
基本的には上記のようなこんな感じ。具体的には下記。
- // DOM化したものから「div」取得
- $node = $dom->find("div");
- // とりあえず「outertext」を取得
- foreach( $node as $v ){
- $all[] = $v->outertext;
- }
- // 親要素の番号を取得
- for( $i=0; $i<count($all); $i++ ){
- if( $i === 0){
- $compare = $all[$i];
- $reps[] = $i;
- }else{
- $j = count($reps) – 1;
- // 一つ前の「outertext」内に含まれるかチェック
- if( !strstr( $compare, $all[$i] ) ){
- $compare = $all[$i];
- $reps[] = $i;
- }else{
- $pattern = "/" . $all[$i] . "/u";
- $compare = preg_replace($pattern, "", $compare);
- }
- }
- }
- // 必要な親要素のみ取得
- foreach( $reps as $v ){
- $arys[] = $node[$v];
- }
- // 必要なものを取得:例えば「plaintext」を取得
- foreach( $arys as $v ){
- $plaintext[] = $v->plaintext;
- }
DOM化し、とりあえず全部タグごと取得
「1~7行目」でタグごと(outertext)取得する。
$all:
[0] <div>あ<div>い</div>う</div>
[1] <div>い</div>
[2] <div>か<div>き</div>く</div>
[3] <div>き</div>
[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
[0] 0
[1] 2
必要な親要素のみ取得
「27~30行目」で必要な親要素のみにする。
必要な親要素は「$node」の番号が「$reps」のみ。
好きな値を取得する
「32~35行目」で好きにする。
今回は「plaintext」を取得する。
$plaintext:
[0] あいう
[1] かきく
[0] あいう
[1] かきく
課題
孫要素まであった場合は問題が発生する。
問題なし(子要素まである):
<div>あ<div>い</div>う</div>
<div>あ<div>い</div>う</div>
問題あり(孫要素まである):
<div>あ<div>い<div>え</div></div>う</div>