文字列中の任意の数字を換算する方法

このQ&Aのポイント
  • RSSを読み込んで天気予報を表示しようと考えていますが、mph(マイル/時)で表示されている風速をm/秒に換算する方法を教えてください。
  • 例えば、$description = "やや曇り  風向き: 南南東  風力: 9 mph.  のち 小雨  風向き: 南  風力: 9 mph. "という文字列があります。この文字列中の mph の数字を m/秒 に換算したいです。
  • 正規表現を使ってうまく抽出できるかもしれませんが、正規表現に関しては初心者で詳しく分かりません。どのように実装すれば良いでしょうか?
回答を見る
  • ベストアンサー

文字列中の任意の数字を換算

RSSを読み込んで天気予報を表示しようと考えていますが、mph(マイル/時)で表示されている風速をm/秒に換算する段階で困っています。 例) $description = "やや曇り  風向き: 南南東  風力: 9 mph.  のち 小雨  風向き: 南  風力: 9 mph. "; 上記の例では、"9 mph."が2箇所ありますが、これらをいずれも $ms = $mph * 0.45; として $description = "やや曇り  風向き: 南南東  風力: 4 m/秒  のち 小雨  風向き: 南  風力: 4 m/秒 "; と変換したいのですが、数字をどのように抽出したらいいのかが分かりません。対象がRSS読み込み結果ですので、もちろん数値は毎回変わります。 正規表現を使えばうまくいくかも、というところまでは分かるのですが、何分にも正規表現に関しては超素人です。検索も試みましたがうまくヒットしませんでした。 何卒、ご教示お願いいたします。

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>その他のパターンでは変換されなかったり、 そうですね、当然考えるべきパターンを全然考慮してませんね。すみませんボケてました。 単純に、次のようなパターンでいいと思います $result=preg_replace("/(\d+)( mph)/e","round(\\1*0.45).' m/秒'",$description ); >計算結果が期待していたものと違ってくるのです。 四捨五入してますが、不要ならroundを消してください

kaz_dl
質問者

お礼

実現できました! BLUEPIXYさん、ありがとうございました。 これを機に、もう少し正規表現を学習することにします。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

$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";

kaz_dl
質問者

補足

申し訳ありません。$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さんからご提示のあった方法をヒントに自分でも考えてみますが、引き続きご回答お待ちしています。 言葉足らずの質問で申し訳ありませんでした。

関連するQ&A

  • 正規表現で指定範囲の文字列の取得

    perlでRSSファイルを取得してTITLEタグの内容を抜き出したいのですが、 XML::RSSが使えない状況では、どのようにしたらいいでしょうか? my $document = LWP::Simple::get($url)後に正規表現で取り出して print タイトル<br>という風に表示しようと思っています。 よろしくお願いします。 ----下記のページを参考にしています。 http://www.itmedia.co.jp/enterprise/articles/0702/22/news014.html

    • ベストアンサー
    • Perl
  • 風力発電データの平均値の求め方

    風力発電電力は風速3乗則で求められます。 以下、例で示すと、 定格 風速10m/sに於いて、発電電力1kWの場合、 これを計算すると次のようになります。 風速  発電力(量) m/s  W(Wh) 2.0   8.0 3.0  27.0 4.0  64.0 5.0  125.0 6.0  216.0 風速が1時間続いた場合は発電量Whになります。 これを実測データに置き換えて質問します。 上記区間についてそれぞれ平均(合計の平均)を求めると、 平均風速は、  4.0 m/s 発電力は、合計440.0、平均88.0 W この結果による、88.0 W/平均風速4.0 m/sは、 計算(定格)上の 64.0 W/風速4.0 m/s より効率が良い評価となってしまいます。 全般的にこの方式(平均発電量対平均風速)の値は、定格(1点値)を上回る結果となります。 定格(1点値)と比較できるところの、前記の6点の発電力対風速の結果のまとめ方(風速○○値に対する発電力○○値)の手段があったら教えてください。 #### 3乗合計3乗根の平均や3乗合計平均の3乗根では無理でした。他の風速も含めて乖離が多きぎですす。

  • WebページまたはRSSフィードから任意の文字列を抽出する(または色を変える太字にする)ブックマークレットを探しています

    WebページまたはRSSフィードから任意の複数の文字列(※)を抽出する(または色を変えて表示する、フォントを変える、太字にする)方法はありませんか? JavascriptによるBookmarkletで実現可能だと思ったのですが、アドバイスお待ちしています。 (※「WebページまたはRSSフィードから任意の複数の文字列」という表現が分かりにくいですが、例えばこの質問が載っているページを例にとると「カテゴリー」「ブックマーク」「回答」と言った任意の文字列を一度に抽出[または色を変えて表示する、フォントを変える、太字にする]方法を探しています。)

  • GoogleFeedApiで任意タイトルの付け方

    サイト名の正規の取得方法は、 var feed = new google.feeds.Feed(”URL”); var title = rss.feed.title; document.writeIn(title); 多分?こんな感じなのでしょうけど、自分は、各サイトごとに指定したサイト名を表示させたいので、 http://wp.7zz.jp/news/ajax/2447.html ↑のサイトをほぼ全部参考にして、 var site = new Array(); site[0] ={ title:'GIZUMODO', url:'http://feeds.gizmodo.jp/rss/gizmodo/index.xml', disp_entry:2 }; ↑のようにサイの情報を配列に手入力して、 ~前略~ function init() { var site_count = 0; for (var i=0; i<site.length; i++){ // 読み込むRSSを設定 var feed = new google.feeds.Feed(site[i]['url']); feed.setNumEntries(site[i]['disp_entry']) //●↓追加 var title = site[i]['title'];    //●↑           feed.load(function(rss) { if (!rss.error) { // RSSからサイトの情報を配列に格納 //●↓変更        channel['title'] = title; //●↑ channel['link'] = rss.feed.link; channel['favicon'] = "http://favicon.hatena.ne.jp/?url=" + channel['link']; channel['description'] = rss.feed.description; channel['author'] = rss.feed.author; ~後略~ }} みたいな小学生レベルの改変をしたのですが、全てのタイトル名が同じになってしまいます。 javascriptの入門書を読んだ程度の私に、どこがおかしいのか指摘お願いいたします。よろしくお願いいたします。

  • RSS pubDate 変換モジュール

    RSSリーダを勉強しています。 XML::RSSでpubDateを取り出したのはいいのですが、加工の仕方がわかりません。rss1.0、rss2.0とかに対応したものを自分なりに正規表現でやらないとダメなんでしょうか?いい方法やモジュールなどがあったら教えてください。 例 Thu, 1 Nov 2009 17:00:00 +0900 -> 2009年11月01日 17時00分

    • ベストアンサー
    • Perl
  • 風向き表示と雲の動きの食い違いについて

      Yahoo!天気による本日の関東地方(足立区)の天気ですが、風は北北西の風4m/sと表示されているのに、雨雲ズームレーダーをみると雲が南から北に向かって移動しているのが分かります。 これはつまり南風が吹いていることを意味するのではないでしょうか。 風向き表示と雲の動きが食い違いのはなぜでしょう。    

  • エクセルの文字列を空白で文字数を揃えたい

    皆様のお知恵を拝借したく書き込んでいます。 どうか宜しくお願いいたします。 エクセルにあるデータをカンマ区切りCSVに したいと思っております。 *例 1,1,1,3,1,2,11,・・・ これに数値を空白で埋めて四文字(0001,等)にさせたいのですが、 どのような方法が可能でしょうか? ・試したこと 1、サクラエディタでの正規表現 でも、置換後の文字列を動的に渡せるのかわからなくて失敗。 2、セルの表示形式 数値の桁数によって変化させる方法がわからず 3、エクセルマクロ LEN関数を使ってループさせれば可能? (時間がかかりそうです) 以上、宜しくお願いします。

  • 配列

    数日前に配列について質問したんですが質問の内容がうまく書けなかったので詳しく書きます。 私はVB.NETを使っています。 Monday,晴,南西,12,88,66 Tuesday,晴曇,南,3,90,77 Wednesday,曇,南東,6,88,56 Thursday,雪,北,15,66,44 Friday,雨,北東,12,70,55 Saturday,雷,東,9,72,56 Sunday,快晴,西,10,77,69 このようなデータが書かれたテキストファイルがあります。 これは曜日、天気の状態、風向き、風速、最高気温、最低気温を表しています。 またメニューバーに”ファイル”、”曜日”を作ります。 ファイルの中には”読み込み”と”終了”を作り、 曜日の中には月、火、水、木、金、土、日を作ります まずファイルの読み込みを押したら月曜日のデータが項目ごとのラベルに表示されるようなプログラムを作りたいんです。   このような感じに・・   状態    晴   風向き   南西   風速    12   最高気温  88   最低気温  66 またメニューの曜日の中で例えば水曜日を押したら水曜日のデータが上と同じように表示されるようにもしたいんです。 このようなプログラムを作りたい時・・ 1.このような配列を作る時どのようなコードになりますか? 2.Private Sub Form1_Load はどのようなコードを組めばいいですか? 最近VBを勉強し始めて一番ここが知りたいんです。 ここのコードの作り方がわからなければ先に進めません。。 ホントに質問が丸投げですいません(><。) でも、できればこのプログラムのコードを教えてください!お願いします。

  • ベクトルの計算について教えて下さい

    エクセルでベクトルの計算をしたいのですがどのようにしていいのか分かりません。 どなたかご教授いただけませんでしょうか。 具体的な内容としては以下の通りです。 例(1) グライダーを「空気に対して」10m/sで360°方向(北)に進ませたい。 このとき、風が90°(東)から10m/sで吹いている。 360°方向(北)に グライダー(☆)を飛ばしたい(「空気に対して)10m/sで) ↑ | | ☆←---風が90°(東)から10m/sで吹いている この場合、グライダーを飛ばすべき方向はベクトルの和をとって、45°(北東) となる。 グライダーを45°(北東)に飛ばすと、風に流され、結果的にちょうど360°に 飛び、そのときの「地面に対する」速度は10m/sのままとなる (風は進行方向の真横から吹いているので、「地面に対する速度」は変化しないので) 例(2) グライダーをが「空気に対して」10m/sで360°方向(北)に進ませたい。 このとき、風が180°(南)から10m/sで吹いている。 360°方向(北)に グライダー(☆)を飛ばしたい(「空気に対して)10m/sで) ↑ | | ☆ ↑ | | 風が180°(南)から10m/sで吹いている この場合、グライダーを飛ばすべき方向はベクトルの和をとって、360°(北) となる。 このとき、グライダーの「空気に対する速度」が10m/sであり、その空気自体が 360°の方向に10m/sで進んでいるので、「地面に対する」速度は20m/sとなる 長文になりましたが、 以下の3つのベクトル(方向と速度)から A【飛ばしたい方向(既知数)      、地面に対する速度(未知数)】 B【風向(既知数)           、風速(既知数)      】 C【風を加味して飛ばすべき方向(未知数)、空気に対する速度(既知数)】 A、Cの未知数を作図手法ではなく数式的ににより解を得たいと考えています(最終的にはエクセルで様々なパターンの計算が容易にできるようにしたいと考えていますので)。 方法としては、【方向、速度】をSin、Cosを用いて直行する成分【X、Y】成分に分ける必要があるかと思います。 しかし、ベクトルBに関しては【風向、風速】ともに既知数なので直行ベクトルに分解できますが、ベクトルA、Bについてはベクトルの中に未知数があるため、直行成分に分解できず困っています。 また、仮に直行成分に分解できたとしてもそれを数式的にどのように 取り扱えばよいのか分かりません。 よい方法をご存知の方おられましたら、 是非ご教授いただけませんでしょうか。 よろしくお願いします。

  • 文字列から「任意の数字+特定の文字」を探す

    VBA マクロ操作なのですが、ある文字列中に「任意の数字+特定の文字」があればそこで分離、というコードを作りたいと思っています。 具体的には Cells(1,1)=24-15[5,5-[- ↓ ”5[”で分離 Cells(1,1)=24-15 他には Cells(1,1)=2[-1  → 2 Cells(1,1)=6[[-[1[   → 6[[-[1 Cells(1,1)=7-[-1  → 7-[-1 という結果を得たいと思っています。 ”数字+[ "となっている部分を探したいのですが、文字である" [ "は指定できますが数字が何かは不明です。 ”数字+[ "がない場合もありその時は分離しません。 よろしくお願いします。