■
単純なテーブルから array に変換するコードを書いてみるテスト。
実はオリジナルはC# で作ったルーチンなんですがww
HTMLを渡すと、最初のテーブルをarrayに変換してくれます。
ライセンスはNYSLでどうぞご自由に。
//table タグを arrayに変換 //複雑なテーブルには未対応です。 //ArrayList[y] = {ArrayList[x]} 形式です. function & TableToArray($inHTML) { $y = array(); //枝刈り $inHTML = str_replace("<TABLE", "<table",$inHTML); $inHTML = str_replace("<TR", "<tr",$inHTML); $inHTML = str_replace("</TR", "</tr",$inHTML); $inHTML = str_replace("<TD", "<td",$inHTML); $inHTML = str_replace("</TD", "</td",$inHTML); $inHTML = str_replace("<TH", "<td",$inHTML); //TD扱い $inHTML = str_replace("</TH", "</td",$inHTML); $inHTML = str_replace("<th", "<td",$inHTML); $inHTML = str_replace("</th", "</td",$inHTML); $tableStart = strpos($inHTML , "<table"); if ($tableStart === FALSE) { return $y; } $tableEnd = strpos($inHTML , "</table", $tableStart); if ($tableEnd === FALSE) { return $y; } $trLoop = $tableStart; while(true) { //TRタグ 行の取得 $trStart = strpos($inHTML , "<tr", $trLoop); if ($trStart === FALSE) { break; } if ($trStart > $trLoop + $tableEnd - $trLoop) { break; } $trEnd = strpos($inHTML , "</tr>", $trStart); if ($trEnd === FALSE) { break; } if ($trEnd > $trStart + $tableEnd - $trStart) { break; } $trLoop = $trEnd + 1; //TDタグ 列の取得 $x = array(); $tdLoop = $trStart; while (true) { $tdStart = strpos($inHTML , "<td", $tdLoop); if ($tdStart === FALSE) { break; } if ($tdStart > $trEnd + $trEnd - $tdLoop) { break; } $tdEnd = strpos($inHTML , "</td>", $tdStart); if ($tdEnd === FALSE) { break; } if ($tdEnd > $tdStart + $trEnd - $tdStart) { break; } $tdLoop = $tdEnd + 1; //中身を保存. $node = substr($inHTML , $tdStart , $tdEnd - $tdStart); $x[] = KillTag($node); } $y[] = $x; } return $y; } function & KillTag($inHTML) { $retString = ""; $tagLoop = 0; while (true) { $tagStart = strpos($inHTML , '<', $tagLoop); if ($tagStart === FALSE) { break; } //タグが始まるまでのテキストの取り込み if ($tagStart - $tagLoop > 0) { $retString .= substr($inHTML , $tagLoop, $tagStart - $tagLoop); } $tagEnd = strpos($inHTML ,'>', $tagStart );; if ($tagEnd === FALSE) { break; //タグを閉じていない?? } $tagLoop = $tagEnd + 1; } return $retString; }
オリジナルのC#版。
//table タグを Array に変換 //複雑なテーブルには未対応です。 //ArrayList[y] = {ArrayList[x]} 形式です. ArrayList TableToArray(string inHTML) { ArrayList y = new ArrayList(); //枝刈り inHTML = inHTML.Replace("<TABLE", "<table"); inHTML = inHTML.Replace("</TABLE", "</table"); inHTML = inHTML.Replace("<TR", "<tr"); inHTML = inHTML.Replace("</TR", "</tr"); inHTML = inHTML.Replace("<TD", "<td"); inHTML = inHTML.Replace("</TD", "</td"); inHTML = inHTML.Replace("<TH", "<td"); //TD扱いにする inHTML = inHTML.Replace("</TH", "</td"); //TD扱いにする inHTML = inHTML.Replace("<th", "<td"); //TD扱いにする inHTML = inHTML.Replace("</th", "</td"); //TD扱いにする int tableStart = inHTML.IndexOf("<table"); if (tableStart < 0) { return y; } int tableEnd = inHTML.IndexOf("</table>", tableStart); if (tableEnd < 0) { return y; } int trLoop = tableStart; while(true) { //TRタグ 行の取得 int trStart = inHTML.IndexOf("<tr", trLoop, tableEnd - trLoop); if (trStart < 0) { break; } int trEnd = inHTML.IndexOf("</tr>", trStart, tableEnd - trStart); if (trEnd < 0) { break; } trLoop = trEnd + 1; //TDタグ 列の取得 ArrayList x = new ArrayList(); int tdLoop = trStart; while (true) { int tdStart = inHTML.IndexOf("<td", tdLoop, trEnd - tdLoop); if (tdStart < 0) { break; } int tdEnd = inHTML.IndexOf("</td>", tdStart, trEnd - tdStart); if (tdEnd < 0) { break; } tdLoop = tdEnd + 1; //中身を保存. string node = inHTML.Substring(tdStart , tdEnd - tdStart); x.Add(KillTag(node)); } y.Add(x); } return y; } string KillTag(string inHTML) { string retString = ""; int tagLoop = 0; while (true) { int tagStart = inHTML.IndexOf('<', tagLoop); if (tagStart < 0) { break; } //タグが始まるまでのテキストの取り込み if (tagStart - tagLoop > 0) { retString += inHTML.Substring(tagLoop, tagStart - tagLoop); } int tagEnd = inHTML.IndexOf('>', tagStart); if (tagEnd < 0) { break; //タグを閉じていない?? } tagLoop = tagEnd + 1; } return retString; }