過去の結果感想とか考察とかのまとめを「前置き」の「最初に」に置きましたので、ブログの読み込み遅い時とかはご活用をー。
前回、とりあえず結果ファイルを読み込ませるまでは行きました。
じゃあ次は、ソースを見ましょう!!
……ソースの見方はわかりますかね?
chromeの場合は、適当なページ内の位置を右クリックし、ページのソースを表示をクリック。
そしてこれは多分多くのブラウザで同様です。
めっちゃ文字列が並んでますね!
これを読んで、使えそうなところを使っていきましょう。
ちなみにソースの表示の仕方はCtrl+Uやview-source:をhttp ://やfile ://の前につけるなどの方法もあります。
また、「その他のツール」から「デベロッパーツール」を選ぶことで複雑なソースを読みやすくなったりもしますが……まあやることは単純なのでそこまでは要らないでしょうね。
まずは……キャラクター名!!
戦闘開始時に居る「キャラクターの名前」を取得していきましょう。
さらに装備・スタイルも「キャラクターの名前」と紐付けて取得し、攻撃の際のダメージとキャラクター名を照らし合わせれば、今回の最低限の目標が完了しますね。
戦闘開始時に居ないエイドや召喚のデータはなんか取るのめんどいので、そういう意味でもそこで照らしておくのが一番楽です。
さてさてキャラクター名、どこから取るのがいいでしょうか?
うーん……
ここ!
……いや別にここに限らないのですが、まあここってことで。
さて、ソースの中でここに当たりそうなのはどの辺かな?
Ctrl+Fでページ検索機能を出して、ソースの中を検索してみましょう。
手がかりとなりそうなのはキャラクター名やEnoもありますが……ここはPT名の
「破壊!破壊!破壊!」
で検索を。
検索結果は二個ありますが、まあ上の方で間違いないでしょう。
なんかそれっぽいこと書いてありますしね!
じゃあPHPの構文で、ここから必要な文字列を、どうやって引っこ抜くか!
preg_match_allを使いましょう。
$pattern1 = '/<TABLE WIDTH=850 CELLPADDING=5 CELLSPACING=0 BORDER=0><TR>(.*?)<BR><BR><BR>/s';
preg_match_all($pattern1,$src,$outa0);
こう書くと、preg_match_allくんは、preg_match_all($pattern1,$src,$outa0);
・1行目にある$pattern1の条件で、
・読み込んだ結果ファイルである$srcの中からそれにあったものを抜き出して、
・特に$pattern1中の条件及び(.*?)に合っている部分を$outa0という形で
書き出してくれます。
すなわち、
この青くなってる部分を$outa0くんという名前で読んでくれるわけですね。
前回のpre1.phpの中のecho $src;を消して、その辺に上の文字列と、
print_r($outa0);を一緒に入れてみましょうか。
……さてはこれもソースを見ないとわかりにくいな?
ソースを見ましょうか。
OK。
$outa0の配列、つまりarrayの中の[0]番目の[0]番目と、[1]番目の[0]番目に、それぞれ検索結果が入っています。
$outa0は実際には、
$outa0
┣[0]━[0]━検索結果1
┗[1]━[0]━検索結果2
のような構造の配列になっていることがわかりますね。
……わかりません?
まあわからなくても大丈夫です。なぜなら、[0][0]も[1][0]も対して変わらないからですね!
もっというと[1][0]指定しておけば基本的には大丈夫です。
まあそれは見れば分かる通り、[1][0]番目の配列中には(.*?)にあたる部分、というよりは()の中の部分しか入っていません。
じゃあ.*?って何?うーん……
すべてです。
もう少しちゃんとした言い方だと、正規表現上の「最短でマッチするあらゆる文章」がこれに入るので……まあ条件1(.*?)条件2で挟むとほしい文章が入るとだけ理解すれば問題ないでしょう。
ぼくはそうとしか理解してないですし。
つまり、これ以降は$outa0[0][0]とか$outa0[1][0]とか書くと、検索結果2であり(.*?)である部分、もっというとさっき青くした部分とかを意味してくれます。
続き。
切り取った範囲で、名前にあたる部分はどういう書き方をされているか。
<B CLASS=WD1></B>や<TD NOWRAP><B></B>で囲まれていることがわかりますね。
ならば……こう!
$patte2 = '/<B CLASS=WD.>(.*?)</';
preg_match_all($patte2,$outa0[0][0],$outa1);
print_r($outa1);
echo "<br>";
echo $outa1[1][0];
echo "<br>";
echo "<br>";
$patte3 = '/<TD NOWRAP><B>(.*?)</';
preg_match_all($patte3,$outa0[0][0],$outa2);
print_r($outa2);
echo "<br>";
echo $outa2[1][0];
こうすると、preg_match_all($patte2,$outa0[0][0],$outa1);
print_r($outa1);
echo "<br>";
echo $outa1[1][0];
echo "<br>";
echo "<br>";
$patte3 = '/<TD NOWRAP><B>(.*?)</';
preg_match_all($patte3,$outa0[0][0],$outa2);
print_r($outa2);
echo "<br>";
echo $outa2[1][0];
$outa1と$outa2の配列中[1][0]、つまり$outa1[1][0]や$outa2[1][0]の中にキャラクター名、
今回で言えば「くるい」「ナレハテ」両名の名前を格納出来ましたね!
ここまでくればあとは本当に同じことの繰り返しです。
装備、スタイル、ダメージ、技、etc……。全部同じように取得していきます。
じゃあ記事の最後に注意点!3つ!
・preg_match_allの文字列の検索は'/と/'で囲まないと出来ないぞ!
まあこれは説明要りませんね。
全部の条件でちゃんと囲んであります。
精確には'と'が「文字列」を表しているので、文字列以外は単に/と/で囲めば大丈夫なのですが。
どうせ文字列しか検索しないので、'/と/'理解しておけばOK!
・preg_match_allでの複数行検索は'/と/s'で囲まないと出来ないぞ!
勘の良い人はもう気付いているかもしれませんが、$pattern1は$patte2や$patte3と異なり、複数行に渡る検索です。
なので、
$pattern1 = '/<TABLE WIDTH=850 CELLPADDING=5 CELLSPACING=0 BORDER=0><TR>(.*?)<BR><BR><BR>/s';
となっていますね。
・検索条件に「/」を入れるとバグるぞ!!
これも勘の良い人は気付いていそうですが、
$patte2 = '/<B CLASS=WD.>(.*?)</';
は
$patte2 = '/<B CLASS=WD1>(.*?)</B>/';
じゃ駄目なのか。
結論から言うと、駄目です。
Warning: preg_match_all(): Unknown modifier 'B' in C:\xampp\htdocs\ibara\pre1.php on line ~
みたいな表示になると思います。
これは二つ上で言った通り、/と/で囲まれた部分を検索条件としているので、これだと</B>のBの手前時点で検索条件になってしまっていて。
要は、Bの後ろが謎のなにかと判断されてエラーコードが出ている状態になります。
ちなみに、
$patte2 = "/<B CLASS=WD1>(.*?)<\/B>/";
と/と/を囲うものを'と'から"と"に変えて、
先にバックスラッシュ、「\」を/の前に入れるとエラーは回避でき、問題なく検索することもできます。
あるいは、正規表現で任意の一文字を表す「.」を用いて、
$patte2 = "/<B CLASS=WD1>(.*?)<.B>/";
としても大丈夫。
さらにぼくの場合は、「WD1」ってことは1以外のなにかもあるんじゃないか……?
と思ってWD1からWD.に変えてありますね。これでカバーも問題なし。
次の記事はアドベントカレンダーのときのスタート地点まで行きたいですね。
ではでは~。
PR
カレンダー
プロフィール
HN:
甲殻類
性別:
男性
自己紹介:
定期更新型ネットゲーム「SoulDrops」参加者(黒鉄遥[417]PL)。他も色々。
最新記事
(04/13)
(01/21)
(02/06)
(01/17)
(01/13)
最新コメント
[05/16 CloneFBAgish]
[09/03 アカシ]
[04/17 玄武門 影久(1)]
[03/21 甲殻類(ブログ書いてる奴)]
[03/20 玄武門 影久(1)]
アーカイブ
カテゴリー
リンク
ブログ内検索