PHP preg_match常量输出

时间:2015-06-10 01:26:37

标签: php arrays preg-match

我正在尝试解析一个可能有多个值的字符串,如果一个字符串不存在,那么数组会输出我正在寻找一个点的部分,这会让我产生逻辑问题。

我要解析的内容:P1DT12H15MPT1H5MPT15M 基本上它是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位。

2 个答案:

答案 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)仅保留时间组件)