- ベストアンサー
divタグを親要素ごとに配列に格納する方法
- 正規表現を使用して、divタグを親要素ごとに配列に格納することは可能です。
- 指定したHTMLコードに対して正規表現を適用し、該当するdivタグを抽出し、親要素ごとに配列に格納することができます。
- 生成された配列には、各親要素のHTMLコードが格納されます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ちょっとやってみました。 とりあえず結果がわかりやすいように表示してあります もとのdivは分岐をいれるなどすこし複雑に設定してあります <?php function swap_parent(&$a,$b){ $tmp=$a[$b]["end"]; $a[$b]["end"]=$a[$a[$b]["parent"]]["end"]; $a[$a[$b]["parent"]]["end"]=$tmp; if(isset($a[$a[$b]["parent"]]["parent"])){ swap_parent($a,$a[$b]["parent"]); } } $str=<<<eof 0<div id="x1">1<div id="x2">2<div id="x3">3</div>2<div id="x4">4</div>2</div>1</div> 0<div id="x5">5<div id="x6">6</div>5</div> 0<div id="x7">7</div>0 eof; $pattern_start="/<div(?:\s|>)/mis"; preg_match_all($pattern_start,$str,$match["start"],PREG_OFFSET_CAPTURE); $pattern_end="/(?<=<\/div)>/mis"; preg_match_all($pattern_end,$str,$match["end"],PREG_OFFSET_CAPTURE); foreach($match["start"][0] as $key=>$val){ $a=&$array[]; $a["start"]=$val[1]; $a["end"]=$match["end"][0][$key][1]; } for($i=1;$i<count($array);$i++){ for($j=$i-1;$j>=0;$j--){ if($array[$i]["start"]<$array[$j]["end"]){ $array[$i]["parent"]=$j; swap_parent($array,$i); break; } } } print htmlspecialchars($str)."<br>"; print "<hr>"; foreach($array as $val){ print htmlspecialchars(substr($str,$val["start"],$val["end"]-$val["start"]+1))."<br>"; } print "<hr>"; foreach($array as $val){ if(!isset($val["parent"])) print htmlspecialchars(substr($str,$val["start"],$val["end"]-$val["start"]+1))."<br>"; } ?>
その他の回答 (1)
- foreach
- ベストアンサー率51% (43/84)
だから http://okwave.jp/qa/q6932872.html で汎用性が無いと指摘したんですよ。 もしかしてパターンが変わる度に質問して解決しようとしてます?
お礼
まさに、求めてたものです。 yambejpさんホントにありがとうございます。 preg_match_all関数のオフセットを利用してsubstrで抜き出す考え方は、これからいろんな場面で使えそうです。swap_parent関数の動きも、ものすごく勉強になりました。