1

私は文字列を持っています:

17s 283ms
48s 968ms

文字列の値は決して同じではなく、そこから「2 番目」の値を抽出したいと考えています。この場合、17 と 48 です。

私は正規表現があまり得意ではないので、私が行った回避策は次のとおりです。

$str = "17s 283ms";    
$split_str = explode(' ', $str);

foreach($split_str as $val){
    if(strpos($val, 's') !== false) $sec = intval($val);
}

問題は、文字's'が split_str[0] と split_str[1] の両方に存在するため、$sec 変数が 17 ではなく 283 を取得し続けることです。

繰り返しますが、私は正規表現があまり得意ではありません。この場合、正規表現が適していると確信しています。手伝ってください。ありがとう。

4

5 に答える 5

6

これには正規表現を使用する必要さえありません。

$seconds = substr($str, 0, strspn($str, '1234567890'));

上記のソリューションは、文字列の先頭からすべての数字を抽出します。最初の数字以外の文字が「s」、スペース、またはその他のものであるかどうかは関係ありません。

しかし、なぜわざわざ?

にキャストすることもでき$strますint

$seconds = (int)$str; // equivalent: intval($str)

実際に見てください

正規表現は、このような単純なタスクには明らかにやり過ぎです。壁に穴を開けるのにダイナマイトを使わないでください。

于 2011-03-26T17:33:43.130 に答える
4

これは次のように行うことができます。

preg_match('/(?<seconds>\d+)s\s*(?<milliseconds>\d+)ms/', $var, $matches);

print_r($matches);
于 2011-03-26T17:34:07.923 に答える
1

文字列が常にこの方法でフォーマットされる場合は、次のように単純に使用できます。

<?php
    $timeString = '17s 283ms';
    $seconds = substr($timeString, 0, strpos($timeString, 's')); 
?>
于 2011-03-26T17:33:49.837 に答える
0

ええと、秒は常にミリ秒の前に来ると想定できると思います。形式が一貫している場合、正規表現は必要ありません。これはそれを行う必要があります:

$parts = explode(' ', $str);
$seconds = rtrim($parts[0], 's')
echo $seconds; // 17s

これにより、文字列がスペースで分割され、最初の部分が取得されます17s。次に、rtrim を使用して「s」を削除すると、17.

于 2011-03-26T17:32:55.800 に答える
0

(\d+s) \d+ms

正しい正規表現です。使用法は次のようになります。

$str = "17s 283ms";
$groups = array();
preg_match("/(\d+)s \d+ms/", $str, $groups);

次に、 ms の前の番号は になります$groups[1]

于 2011-03-26T17:33:10.243 に答える