2014年11月

Luaのテーブルはオブジェクト。
そのため、テーブルのコピーは結果として、参照先がコピーされる。
なので、下記のような現象が起きる。へー。っていう感じ。

local TableTestA ={}
local TableTestB ={}
TableTestA["a"]=10
print("TableTestA[a]:"..TableTestA["a"])  → TableTestA[a]:10 と表示される。
TableTestB=TableTestA            ← テーブルをコピー(参照先がコピーされる)
print("TableTestB[a]:"..TableTestB["a"])  → TableTestB[a]:10 と表示される。
TableTestB["a"]=20               ← Bの方で値を20に変更作業をする。
print("TableTestA[a]:"..TableTestA["a"])  → TableTestA[a]:20 と表示される。←これも変更される。
print("TableTestB[a]:"..TableTestB["a"])  → TableTestB[a]:20 と表示される。←これは当たり前
TableTestA = nil
print("TableTestB[a]:"..TableTestB["a"])  → TableTestB[a]:20 と表示される。

ランキング機能の作成のために、WEB側(PHP)で管理用のコードを記載しているが
新規IDの発行が上手く行かない…。ダミーでID最大値12ぐらいまで作っても、MAXで返ってくる値が9とオカシイ。よくよく調べてみると、IDがテキスト型になっていたからダメで、int型と明示してやればMAX関数が使えた。

//-------------------------------------------------
//  ランキング管理用IDを生成
//-------------------------------------------------
function func_makeID($Settei){

//データベース存在確認
$ext = file_exists($Settei['db_name']);

//今日の日付を取得(2038年問題対応版)
$today = new DateTime(); //本日
$db_today = $today->format('Y-m-d H:i:s');

//データベースを開く
$db = new SQLite3($Settei['db_name']); //SQLite3の構文

if (!$ext){
//データベースが無ければ TABLE作成
//※テーブル名:highscore
//※データ内容:ID,名前,スコア,更新日,作成日
$query = "CREATE TABLE highscore (db_playid int, db_playname , db_score , db_updatedate , db_createdate)";
$db->query($query);
//ダミーデータの登録
$query = "INSERT INTO highscore VALUES(1,'dummy',0,'$db_today','$db_today')";
$db->query($query);
}

//データベースが在れば現在のID最大値を調べる
$query = "SELECT MAX(db_playid) FROM highscore"; //idの最大値を取得する
$results = $db->query($query); //データベースからデータを引っ張ってくる
$arr = $results->fetchArray(SQLITE3_ASSOC);
$maxno = $arr["MAX(db_playid)"];

//新規IDの発行
$newplayid = $maxno + 1;
$query = "INSERT INTO highscore VALUES($newplayid,'NoName',0,'$db_today','$db_today')";
$db->query($query);

print("NewPlayID:".$newplayid);

$db->close(); //データベースの切断 SQLite3

ランキング管理用APIを作りたくて、PHPとcoronaを行ったり来たりしていますが、network.requestを使用してWEBからデータを引っ張ってきたらHTMLタグまで綺麗に読み込んでしまう…。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>PHPテスト</title>
</head>
<body>
[ここにPHPからの戻り値が記載してある。]
</body>
</html>

PHPからの戻り値がほしいだけで、それ以外は不要。
なので、 network.requestで返って来た値からタグをバッサリ切ってしまうコードを追加。

--strにHTMLタグ付きの値を放り込めば、それを削除して返してくれる。
function htmltagdelete(str)
local tagpattrn
tagpattrn="\n" --HTML構文上の改行コードには何ら意味が無いので削除!
str = string.gsub(str,tagpattrn,"")

tagpattrn="<br/>" --HTML構文上の改行はBRタグなのでBRタグのものは改行コードに変換!
str = string.gsub(str,tagpattrn,"\n")

tagpattrn="<BR/>"
str = string.gsub(str,tagpattrn,"\n")

tagpattrn="<BR>"
str = string.gsub(str,tagpattrn,"\n")

tagpattrn="</p>" --Pタグ(段落)の終了コードも改行と同じような意味合いがあるので、改行コードに変換!
str = string.gsub(str,tagpattrn,"\n")

tagpattrn="</P>"
str = string.gsub(str,tagpattrn,"\n")

tagpattrn="<title>.-</title>"
str = string.gsub(str,tagpattrn,"")

tagpattrn="<.->"
str = string.gsub(str,tagpattrn,"")
return str
end

とりあえず、これでHTMLタグを除外出来た。
もう少しスッキリスべきなんだろうが・・・。 
最後の、tagpattrn="<.->"だけど、 tagpattrn="<.+>"にすると、全て消えてしまった。
"-"であれば、マッチする最小限の範囲に展開されるから正しく処理がされると。 

↑このページのトップヘ