重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

RSSを読み込んで天気予報を表示しようと考えていますが、mph(マイル/時)で表示されている風速をm/秒に換算する段階で困っています。

例)
$description = "やや曇り  風向き: 南南東  風力: 9 mph.  のち 小雨  風向き: 南  風力: 9 mph. ";

上記の例では、"9 mph."が2箇所ありますが、これらをいずれも
$ms = $mph * 0.45;
として

$description = "やや曇り  風向き: 南南東  風力: 4 m/秒  のち 小雨  風向き: 南  風力: 4 m/秒 ";

と変換したいのですが、数字をどのように抽出したらいいのかが分かりません。対象がRSS読み込み結果ですので、もちろん数値は毎回変わります。
正規表現を使えばうまくいくかも、というところまでは分かるのですが、何分にも正規表現に関しては超素人です。検索も試みましたがうまくヒットしませんでした。

何卒、ご教示お願いいたします。

A 回答 (2件)

>その他のパターンでは変換されなかったり、


そうですね、当然考えるべきパターンを全然考慮してませんね。すみませんボケてました。
単純に、次のようなパターンでいいと思います
$result=preg_replace("/(\d+)( mph)/e","round(\\1*0.45).' m/秒'",$description );

>計算結果が期待していたものと違ってくるのです。
四捨五入してますが、不要ならroundを消してください
    • good
    • 0
この回答へのお礼

実現できました! BLUEPIXYさん、ありがとうございました。

これを機に、もう少し正規表現を学習することにします。

お礼日時:2005/11/13 13:40

$description = "やや曇り  風向き: 南南東  風力: 9 mph.  のち 小雨  風向き: 南  風力: 9 mph. ";


$result=preg_replace("/(.+)(\d+)( mph)(.+)(\d+)( mph)(.+)/e","'\\1'.round(\\2*0.45).' m/秒\\4'.round(\\5*0.45).' m/秒\\7'",$description);
print "$result\n";

この回答への補足

申し訳ありません。$descriptionのサンプルが少なかったようです。

1) $description = "晴れ  風向き: 北  風速: 11 mph. ";
2) $description = "やや曇り  風向き: 北  風速: 16 mph  最大風速: 27 mph. ";
3) $description = "やや曇り  風向き: 南南東  風力: 9 mph.  のち 小雨  風向き: 南  風力: 9 mph. ";
4) $description = "やや曇り  風向き: 北  風速: 16 mph  最大風速: 27 mph.  のち 晴れ  風向き: 北  風速: 11 mph. ";
5) $description = "おおむね曇り  風向き: 北  風速: 11 mph.  のち やや曇り  風向き: 北  風速: 16 mph  最大風速: 27 mph. ";
6) $description = "おおむね曇り  風向き: 北  風速: 11 mph. 最大風速: 17 mph.  のち やや曇り  風向き: 北  風速: 16 mph  最大風速: 27 mph. ";

など、いろいろなパターンがあるのです。

BLUEPIXYさんからご提示いただいた式では、3)のパターン(最初に提示した例)は確かにうまくいくのですが、その他のパターンでは変換されなかったり、計算結果が期待していたものと違ってくるのです。
考えられるあらゆるパターンの文字列 $description に出てくる全ての "~mph."を、"(~*0.45) m/秒"に変換する方法はないでしょうか?

BLUEPIXYさんからご提示のあった方法をヒントに自分でも考えてみますが、引き続きご回答お待ちしています。

言葉足らずの質問で申し訳ありませんでした。

補足日時:2005/11/13 10:59
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!