2011-03-01 11 views
0

私は多くの行と列を有しており、これらのラインの一つが温度の読み取りなどのように温度を取るために使用される方法である。PHPのREGEX、ラインからの二つの値(オプション1)を抽出しようと

Example line 1 
temp: 35.20c/95.36f - axillary 
Example line 2 

明らかに、温度は「35.20c/95.36f」であり、方法は「腋窩」である。メソッドの部分はオプションです。メソッドがオプションである可能性があるため、両方を抽出するREGEXパターンの作成に問題があります。私はこれに似たプリントを得ることを期待する

temp: 35.20c/95.36f - axillary 
temp: 35.20c/95.36f 
temp: 35.20c/95.36f - oral 

::次の文字列でそう

私はpreg_match_allでパターンを(実行する場合)

Array 
(
    [0] => Array 
     (
      [0] => temp: 35.20c/95.36f - axillary 
      [1] => temp: 35.20c/95.36f 
      [2] => temp: 35.20c/95.36f - oral 
     ) 

    [1] => Array 
     (
      [0] => 35.20c/95.36f 
      [1] => 35.20c/95.36f 
      [2] => 35.20c/95.36f 
     ) 

    [2] => Array 
     (
      [0] => axillary 
      [1] => 
      [2] => oral 
     ) 

を私は別の多くを試してみましたパターン、私はちょうど私の元(私には意味がある)を投稿します:

$ptn = "/temp: *(.+)(?: -)?(.+)?/"; 

私は私が推測するいくつかの詳細を追加する必要があります。

  • 私は一時は(など35.20c/95.36f、35C、95.3f)に表示されるフォーマットの種類見当がつかない
  • 私は基本的にちょうど取る必要があります"temp:"の後のすべてと、それ以降の一時的なものとしてのハイフンの前のすべてが私の方法になります。
+2

あなたが持っているもの(正規表現)を投稿できますか?私は誰かがあなたのために書くことができると確信していますが、あなたが間違っていた場所を知ることがより有用かもしれません? –

答えて

1

は、この方法を試してください(。+)

<?php 

    $lines = "temp: 35.20c/95.36f - axillary 
temp: 35.20c/95.36f 
temp: 35.20c/95.36f - oral"; 

    preg_match_all("/^temp:\s+([^-\n]+)(-)?(.*)/m", $lines, $matches); 

    print_r($matches); 

?> 
+0

これはこの特定の例では機能しますが、私は本当に特定の形式のtempに依存することはできません。申し訳ありませんが、私の質問に含めるべきでした。 – jreed121

+0

ああ。これは、次のようにする必要があります: '$ ptn ="/^ temp:\ s +([^ - \ n] +)( - )?(。*)/ m "' – dearlbry

+0

優秀です。メソッドの先頭に " - "を付けます。どうもありがとうございます! – jreed121

0

基本的に '?'メソッドのキャプチャグループの後。それはグループがそこにないかもしれないが、パターン全体がまだ一致しているはずであることを示します。あなたのパターンは現時点でどのように見えますか?

+0

申し訳ありませんが、私は私の質問を編集しました。 – jreed121

0

私はここにいくつかの仮定を作るかもしれないが、あなたが原因のすべてのサブグループに次の

/^temp: ((\d+\.\d+c)/(\d+\.\d+f))(- (\w+))?$/ 

を試すことができ、あなたのマッチングの配列はあなたの例ではより多くの項目が含まれていますが、1つのあなたは後にしていますそこにあるはずです

+0

私は#。## c /#。## fを数えることはできません。私は基本的にはテンポラリの後に来るものを取る必要があります。ハイフン( - )の前にテンポ、 。 – jreed121

0

$ ptn = "/ temp :(。)(\ s- \ s)?(。)/";

+0

おかげではなく、実際に私が探して - 印刷: 'code'(配列 ( [0] =>アレイ ( [0] =>温度:35 [1] =>温度:35 [2] =>温度:35 [3] =>温度:96 ) [1] =>配列 ( [0] => 3 [1] => 3 [2] => 3 [3] => 9 ) [2] =>配列 ( [0] => [1] => [2] => [3] => ) [3] =>配列 ( [0] => 5 [1] => 5 [2] => 5 [3] = > 6 ) ) ) – jreed121

1

ああ、私はあなたの問題は一致するすべてのものであると思います。正規表現のパターンは「貪欲」であり、可能な限り試行錯誤します。そのパターンは残りの文字列と一致し、他のグループは何も残しません。

1

あなたが望むようなので、それは私になります

/^temp: (\d+\.\d+)c \/ (\d+\.\d+)f(?: - ([^$]+))?$/ 

摂氏温度は華氏バージョンが$ 2になり、$ 1になり、方法は$ 3になります。 ([^$]+)は、行の終わりまで(空白があれば)すべてをキャプチャするので、何をしたいかによっては正しくない可能性があります。代わりに(?: - ([^$]+?))?\s*$/を使用して、代わりにそれを修正すると思います。

温度は常に10進形式ですか?彼らは "0c/32f"になりましたか?


編集:はちょうどあなたの更新を見ました。 Rob Agarが示唆したように、貪欲な.+が確かに問題の一部であるように見えます。これを試すことができます:

/^temp:\s*(\d+(?:\.\d+)?)c\s*\/\s*(\d+(?:\.\d+)?)f(?:\s*-\s*([^$]+?))?\s*$/ 

方法が複数の単語であっても動作します。それが可能かどうかわからない、私はあなたの要件を推測しています。

+0

は何も返されませんでした。私はそのパターンを使って動作させようとしています。 – jreed121

関連する問題