php or JavaScriptでのパースについて。


http://tyrano.jp/
このプログラムのように「タグ付きのテキストをパースして、ノベルゲームのように表示」したいと考えています。


例えば下記テキストをパースして [l] があると「クリック待ち」、[p]があると「クリック待ちでクリックがあるとセリフを全消しで続きのセリフを表示」のようにします。

--------
昔々あるところに、[l]おじいさんと、おばあさんがいました。[p][cm]

ある日、おばあさんが川に行くと、[l]どんぶらこ、どんぶらこと、[l]桃が流れてきました。[p][cm]
--------

上記の参考URLのソースは難読化されていて、アルゴリズムがつかめませんでした。

参考テキスト(文章の中に、[]で囲まれた命令タグが挿入されているもの)をパースして、上記URLのスクリプトのようなことを実現したいと考えています。

phpでパースして出力し、JavaScriptでは表示のみの予定です。

アドバイスを頂けると助かります。よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/08/06 15:35:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Lhankor_Mhy No.3

回答回数814ベストアンサー獲得回数232

ポイント33pt

パースはjavascriptでやった方がいいんじゃないかな、と思います。どうせコマンドを判別して表示制御するのはjavascriptなんですし。
↓サンプル
http://jsfiddle.net/VMH8D/

他5件のコメントを見る
id:Lhankor_Mhy

タグっぽい処理ができるようにしてみました。
http://jsfiddle.net/VMH8D/3/
ソースが汚い……!

2013/07/31 20:18:47
id:onigirin

どうもありがとうございます。
おおよそ無事取り込めました。

実は1文字ずつ表示するようにしたくて、他のサンプルと合わせています。クリック連打で文字が表示され終わる前に次が表示されるところで先週は限界がやってきました(笑)

いただいたソースのおかげで、Deferred Objectでの処理の流れがなんとなくわかってきたので、resolveしそうです。

この形式だと、カラー指定などの [em color="red"]等もすぐに応用できそうですね。本当に助かります。

2013/08/05 15:39:20

その他の回答2件)

id:dawakaki No.1

回答回数797ベストアンサー獲得回数122

ポイント34pt

preg_split関数を使って、いったん配列(アクション記号とテキスト本体からなる2次元配列)に格納するといいでしょう。
http://www.kokin.rr-livelife.net/php/php_post/php_post_20.html

id:onigirin

どうもありがとうございます。

preg_splitで [xx] による分割をすると、セリフなどの文字列は分割できますが、命令文(アクション記号) [xx] 系が全て消えてしまうため、どうすれば命令文のところも一緒に分割できるんだろう、というところで迷子になっていました。

2013/07/30 16:40:33
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント33pt

preg_match_all を使ってみました。

<?php

    $str = <<<EOT
昔々あるところに、[l]おじいさんと、おばあさんがいました。[p][cm]
ある日、おばあさんが川に行くと、[l]どんぶらこ、どんぶらこと、[l]桃が流れてきました。[p][cm]
EOT;

    preg_match_all("/(.*)\[(l|p|cm)\]/Us", $str, $out, PREG_SET_ORDER);
    foreach ($out as $val) {
        echo "TEXT: " . $val[1] . "<br>\n";
        echo "CMD : " . $val[2] . "<br>\n";
    }

?>

出力結果。

TEXT: 昔々あるところに、
CMD : l
TEXT: おじいさんと、おばあさんがいました。
CMD : p
TEXT:
CMD : cm
TEXT: ある日 ある日、おばあさんが川に行くと、
CMD : l
TEXT: どんぶらこ、どんぶらこと、
CMD : l
TEXT: 桃が流れてきました。
CMD : p
TEXT:
CMD : cm
id:onigirin

どうもありがとうございます。
これは面白い方法ですね。テキストとコマンドを1セットずつ抽出ですね。
目的としては達成できそうですが、もう少しパースのパターンをいろいろ待ってみます。

2013/07/30 19:24:49
id:Lhankor_Mhy No.3

回答回数814ベストアンサー獲得回数232ここでベストアンサー

ポイント33pt

パースはjavascriptでやった方がいいんじゃないかな、と思います。どうせコマンドを判別して表示制御するのはjavascriptなんですし。
↓サンプル
http://jsfiddle.net/VMH8D/

他5件のコメントを見る
id:Lhankor_Mhy

タグっぽい処理ができるようにしてみました。
http://jsfiddle.net/VMH8D/3/
ソースが汚い……!

2013/07/31 20:18:47
id:onigirin

どうもありがとうございます。
おおよそ無事取り込めました。

実は1文字ずつ表示するようにしたくて、他のサンプルと合わせています。クリック連打で文字が表示され終わる前に次が表示されるところで先週は限界がやってきました(笑)

いただいたソースのおかげで、Deferred Objectでの処理の流れがなんとなくわかってきたので、resolveしそうです。

この形式だと、カラー指定などの [em color="red"]等もすぐに応用できそうですね。本当に助かります。

2013/08/05 15:39:20

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません