■
単純なテーブルから 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;
}