- ベストアンサー
PHP正規表現の書き方を教えてください!
- PHP正規表現の書き方を教えてください!
- ヤフーファイナンスランキングから株価データを取得したいが、正規表現の書き方がわからず困っています。
- preg_match_allで配列に格納して株価コードを取得したいが、うまくいきません。3次配列で混乱しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず、$feed に入っているHTMLソースには改行文字が含まれていますので除去しましょう。 ========== $feed = preg_replace("/\r\n/", "", $feed); ========== 改行文字の種類は元データに合わせて調整して下さい。 これをしないと、タグとタグの間に改行文字が入っているので、パターンマッチさせる際にも改行文字の事も考慮する必要があり煩雑になるので不便です。 次に正規表現で取り出したい部分の指定ですが『(.*)』では無く『(.*?)』を使いましょう。 正規表現では、繰り返しを指定すると一番長くなるようマッチさせようとします。 例えば『{<div>(.*)</div>}』という正規表現で『<div>hoge</div><div>fuga</div>』を検索すると『hoge</div><div>fuga』がマッチしてしまいます。 これを『{<div>(.*?)</div>}』という正規表現にすると『hoge』と『fuga』がそれぞれマッチしてくれます。 あと、質問者さんの用途ならpreg_match_allのフラグは PREG_SET_ORDER の方がいいかと思います。 そうすると ========== foreach ($cell as $data) { echo $data[1] . "位 " . $data[2] . " " . $data[3] ...; } ========== といった形で値を取り出せて楽になります。
その他の回答 (1)
こういう処理には正規表現よりもXPathのほうが向いてますよ。 <?php $dom = new DOMDocument; @$dom->loadHTMLFile("http://info.finance.yahoo.co.jp/ranking/"); $xpath = new DOMXpath($dom); $nl2a = function ($list) { return array_map( function ($node) { return $node->nodeValue; }, iterator_to_array($list, false) ); }; $q = '//tr[contains(@class, "rankingTabledata")]/td[following-sibling::td]'; $rows = []; foreach (array_chunk($nl2a($xpath->query($q)), 9) as $i => $r) { $rows[$i]['順位'] = $r[0]; $rows[$i]['コード'] = $r[1]; $rows[$i]['市場'] = $r[2]; $rows[$i]['名称'] = $r[3]; $rows[$i]['取引値'][0] = $r[4]; $rows[$i]['取引値'][1] = $r[5]; $rows[$i]['前日比'][0] = $r[6]; $rows[$i]['前日比'][1] = $r[7]; $rows[$i]['出来高'] = $r[8]; } var_dump($rows);
お礼
返信遅れてすみません。 xpathの方がシンプルにかけそうですね。 でもまだxmlもよくわからないので次レベルで利用させていただきます。 ありがとうございました。
お礼
返信遅れてすみません。 項目ごとに配列要素を表示できました(喜!! ご丁寧な説明ありがとうございました。