-3

サーバーの動的稼働時間の出力を含む文字列があります

20:17:49 up 3 days, 9:25, 1 user, load average: 1.19, 1.34, 1.36
22:00:12 up 1 min, load average: 1.39, 0.46, 0.16
06:40:39 up 445 days, 1:08,  3 users,  load average: 0.01, 0.01, 0.00

ここで、", 1 user"句は存在する場合と存在しない場合があります。この文字列の稼働時間の部分のみを取得する必要があります。つまり、「3 days, 9:25

PHPまたは/および正規表現を使用してこれを行うための最短のバリアントは何ですか?

編集:申し訳ありませんが、文字列が動的コンテンツで構成されていることを忘れていました

4

4 に答える 4

3

これは正規表現を使えば簡単かもしれませんが (正規表現を知っていれば)、次のように PHP について学ぶには独学で行うのが最善だと思います。

  1. の最初の位置を見つけます' up '( を参照strpos())。
  2. その位置から の次の位置を見つけます', '
  3. その位置から', '(再び) の次の位置を見つけます。
  4. 1. の位置と 1. の検索文字列の長さから 3. で見つけた位置までの長さで、substr()当該文字列の を取得します。

あなたはあなたの結果を持っています。これは、具体的なコードを書くための演習として残しておきます。書き方に問題があれば教えてください。


コメントを見ただけでは、実際に 2 つのコンマがあるかどうかわかりません。その後、おそらく後ろからカンマを探す必要があります。


あるレベルでは、正規表現が手に入ります。これは、一致条件をかなり正確に定式化し、特定の部分をオプションにすることができるためです。

$pattern = '/(?<= up )(?:\d+ days?, )?\d{1,2}:\d\d/';
$uptime  = preg_match($pattern, $subject, $m) ? $m[0] : FALSE;

これは、上記の純粋な PHP のアウトラインで の最初の位置を検索するような後読みです' up '(そのため、PHP 文字列関数を使用して最初に記述するのが適切です。次に、正規表現を構築する方法を学び、理解するのが適切です)。次に、オプションの日のパターンを探しています。ここで正規表現は非常に強力です。数字を探して表現するのは簡単だからです。最後に時間の桁を探します。

おそらく、これにはまだ修正が必要です。時間/分の部分の稼働時間のパターンが完全にはわかりません。たとえば、1 日と 1 分だとしたらどうでしょうか。それとも1日0分?ではどうなるでしょうか?

于 2013-01-04T20:53:39.940 に答える
1
<?php
$string = '20:17:49 up 3 days, 9:25, 1 user, load average: 1.19, 1.34, 1.36';
$result = substr($string, strpos($string, 'up')+3, strpos($string, ',') - strpos($string, 'up')+3);

http://codepad.viper-7.com/gDG4Lfを参照してください

于 2013-01-04T20:49:50.270 に答える
0

あなたが正規表現を要求したので:

$regEx = '/.+? up (?:([1-9]+ days, ))?([1]?\d{1}:[0-5]\d{1}).*+/';

// With days included:
$str = '20:17:49 up 3 days, 9:25, 1 user, load average: 1.19, 1.34, 1.36';
echo preg_replace($regEx, "$1$2", $str);

    3 days, 9:25

// No days included:
$str = '20:17:49 up 9:25, 1 user, load average: 1.19, 1.34, 1.36';
echo preg_replace($regEx, "$1$2", $str);

    9:25

RegEx はもっとコンパクトになる可能性がありますが、あまりにも寛大にならなければそれほどでもありません。これには (少なくとも) 小さな問題が 1 つあり0:ます。

于 2013-01-04T20:54:18.100 に答える
-1

explode()次のコマンドを使用するだけで、正規表現なしで実行できます。

$ str = "20:17:49 up 3 days、9:25、1 user、load average:1.19、1.34、1.36";
$ array = explode( ""、$ str);
echo $array[2]。""。$array[3]。""。$ array [4];

編集:エコー結果の修正。

于 2013-01-04T20:49:06.377 に答える