http://tyrano.jp/
このプログラムのように「タグ付きのテキストをパースして、ノベルゲームのように表示」したいと考えています。
例えば下記テキストをパースして [l] があると「クリック待ち」、[p]があると「クリック待ちでクリックがあるとセリフを全消しで続きのセリフを表示」のようにします。
--------
昔々あるところに、[l]おじいさんと、おばあさんがいました。[p][cm]
ある日、おばあさんが川に行くと、[l]どんぶらこ、どんぶらこと、[l]桃が流れてきました。[p][cm]
--------
上記の参考URLのソースは難読化されていて、アルゴリズムがつかめませんでした。
参考テキスト(文章の中に、[]で囲まれた命令タグが挿入されているもの)をパースして、上記URLのスクリプトのようなことを実現したいと考えています。
phpでパースして出力し、JavaScriptでは表示のみの予定です。
アドバイスを頂けると助かります。よろしくお願いします。
パースはjavascriptでやった方がいいんじゃないかな、と思います。どうせコマンドを判別して表示制御するのはjavascriptなんですし。
↓サンプル
http://jsfiddle.net/VMH8D/
preg_split関数を使って、いったん配列(アクション記号とテキスト本体からなる2次元配列)に格納するといいでしょう。
http://www.kokin.rr-livelife.net/php/php_post/php_post_20.html
どうもありがとうございます。
preg_splitで [xx] による分割をすると、セリフなどの文字列は分割できますが、命令文(アクション記号) [xx] 系が全て消えてしまうため、どうすれば命令文のところも一緒に分割できるんだろう、というところで迷子になっていました。
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
どうもありがとうございます。
これは面白い方法ですね。テキストとコマンドを1セットずつ抽出ですね。
目的としては達成できそうですが、もう少しパースのパターンをいろいろ待ってみます。
パースはjavascriptでやった方がいいんじゃないかな、と思います。どうせコマンドを判別して表示制御するのはjavascriptなんですし。
↓サンプル
http://jsfiddle.net/VMH8D/
タグっぽい処理ができるようにしてみました。
http://jsfiddle.net/VMH8D/3/
ソースが汚い……!
どうもありがとうございます。
おおよそ無事取り込めました。
実は1文字ずつ表示するようにしたくて、他のサンプルと合わせています。クリック連打で文字が表示され終わる前に次が表示されるところで先週は限界がやってきました(笑)
いただいたソースのおかげで、Deferred Objectでの処理の流れがなんとなくわかってきたので、resolveしそうです。
この形式だと、カラー指定などの [em color="red"]等もすぐに応用できそうですね。本当に助かります。
タグっぽい処理ができるようにしてみました。
2013/07/31 20:18:47http://jsfiddle.net/VMH8D/3/
ソースが汚い……!
どうもありがとうございます。
2013/08/05 15:39:20おおよそ無事取り込めました。
実は1文字ずつ表示するようにしたくて、他のサンプルと合わせています。クリック連打で文字が表示され終わる前に次が表示されるところで先週は限界がやってきました(笑)
いただいたソースのおかげで、Deferred Objectでの処理の流れがなんとなくわかってきたので、resolveしそうです。
この形式だと、カラー指定などの [em color="red"]等もすぐに応用できそうですね。本当に助かります。