我正在尝试解析一个可能有多个值的字符串,如果一个字符串不存在,那么数组会输出我正在寻找一个点的部分,这会让我产生逻辑问题。
我要解析的内容:P1DT12H15M
,PT1H5M
或PT15M
基本上它是P(天数)T(小时数)(分钟数)。 P和T是不变的。这是我到目前为止的匹配字符串:
'/P([0-9]*?)D?T([1-2]?[0-9]?)H?([1-5]?[0-9]?)M?/'
它将所有东西分开,但数组输出不是我想要的。
PT2H gives Array ( [0] => PT2H [1] => [2] => 2 [3] => )
PT2H15M gives Array ( [0] => PT2H15M [1] => [2] => 2 [3] => 15 )
但是
PT15M gives Array ( [0] => PT15M [1] => [2] => 15 [3] => )
如果可能,我需要将该号码放在第3位。
答案 0 :(得分:0)
$exp = '/P(?:([0-9]+)D)*T(?:([1-2]?[0-9])H)*(?:([1-5]?[0-9])M)*/';
preg_match($exp, 'PT2H15M', $m); print_r($m);
preg_match($exp, 'PT15M', $m); print_r($m);
preg_match($exp, 'P1DT12H15M',$m); print_r($m);
结果
Array
(
[0] => PT2H15M
[1] =>
[2] => 2
[3] => 15
)
Array
(
[0] => PT15M
[1] =>
[2] =>
[3] => 15
)
Array
(
[0] => P1DT12H15M
[1] => 1
[2] => 12
[3] => 15
)
因此,您可以$P = m[1], $H= m[2], $M = m[3]
答案 1 :(得分:0)
您的输入字符串看起来像时间间隔说明符。让PHP内部类DateInterval
解析它们然后访问[DateInterval
]的属性以获取所需的值:
$int = new DateInterval('P1DT12H15M');
print_r($int);
产生
DateInterval Object
(
[y] => 0
[m] => 0
[d] => 1
[h] => 12
[i] => 15
[s] => 0
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] =>
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)
您可以直接访问这些属性(它们是公开的):
printf("%d days, %d hours, %d minutes\n", $int->d, $int->h, $int->i);
如果您需要将它们作为数组,您甚至可以将$int
转换为array
并以这种方式使用它们:
$date = (array)$int;
printf("%d days, %d hours, %d minutes\n", $date['d'], $date['h'], $date['i']);
如果你坚持,你甚至可以模仿你难以创造的preg_match()
的行为:
$string = 'P1DT12H15M';
$interval = new DateInterval($string);
$array = (array)$interval;
$matches = array_merge(array($string), array_slice(array_values($array), 0, 6));
print_r($matches);
显示:
Array
(
[0] => P1DT12H15M
[1] => 0
[2] => 0
[3] => 1
[4] => 12
[5] => 15
[6] => 0
)
(使用array_slice(..., 3, 6)
仅保留时间组件)