質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

1回答

898閲覧

正規表現の書き方について教えてください。

negozan

総合スコア8

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2016/12/18 20:27

PHPのpreg_match_allでwebスクレイピングを試みていて、
正規表現の書き方を思いつかなかったため質問いたします。

以下のようなHTMLに対して、
日付と日付の間のコンテンツを抽出し、
その抽出した情報を、日付と関連付けさせることは可能でしょうか。

<body> <h2>12月10日</h2> <p>今日の天気は晴れ</p> <h2>12月11日</h2> <p>今日やりたいこと</p> <ul> <li>映画鑑賞</li> <li>読書</li> <li>料理</li> </ul> <h2>12月12日</h2> <p>模試の結果</p> <table> <tr> <th>英語</th> <td>185点</td> </tr> <tr> <th>国語</th> <td>160点</td> </tr> </table> </body>

見出しを抽出するだけであれば、<h2>([0-9]+月[0-9]+日)</h2>で事足りることはわかるのですが、
間のコンテンツを拾う方法を思いつきませんでした。

宜しくお願い致します。
質問の意図が不明瞭ということであれば御指摘ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2016/12/19 00:17 編集

具体的にどういった結果を期待しているのでしょうか?配列で受け日付をキーにしたjsonデータとか?
guest

回答1

0

HTML を1行ずつ読む処理をするとして、

  • 日付である行を見つけたら、次に日付である行までをひとまとめにして関連付ける

のですよね。

PHP

1$fp = fopen(ファイル名, 'r'); 2$lines = array(); 3$date = ''; 4$result = array(); 5while (!feof($fp)) { 6 $line = fgets($fp); 7 if (preg_match('<h2>([0-9]+月[0-9]+日</h2>', $line, $matches)) { 8 if ($date != '') { 9 // 前回の <h2> からこの直前までが $date の詳細情報 10 $result[$date] = $lines; 11 } 12 $date = $matches[1]; 13 $lines = array(); 14 } else if ($line == '</body>') { 15 // データ部分終了なので打ち切り 16 break; 17 } else if ($date != '') { 18 $lines[] = $line; 19 } 20} 21// 最後の <h2> の部分はまだ登録されていないので、その分を登録 22$result[$date] = $lines; 23fclose($fp);

でうまくいくかな?
<h2>でかつ日付でない行があったらどうするのかとか、同一日付の行があったらどうするとか考えることはまだあると思いますが

投稿2016/12/19 00:29

編集2016/12/19 00:45
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

negozan

2016/12/19 15:06

ありがとうございます! 全てを正規表現で解決するのではなく、まず一行ずつ読んでいくのが良さそうですね。 頭が固かったです。助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問