【问题标题】:String to array (regex, explode or something else)?字符串到数组(正则表达式、爆炸或其他)?
【发布时间】:2018-08-13 18:57:56
【问题描述】:

打破格式为"PT2M19S""PT19S"(YouTube api 视频持续时间)的字符串的最简单方法是什么,以便我最终得到这样的数组?

Array
(
    [M] => 2
    [S] => 19
)

【问题讨论】:

  • 如果没有看到“非常奇怪的循环”,我们都不得不同意它看起来“非常尴尬”。
  • 你想要:"PT2M19S" 或 "PT19S" 但实际的字符串是什么?
  • 你打算如何处理这些数字?
  • 使用这个正则表达式会更好:(?:([0-9]*)+[M])?([0-9]*)[S] 和读取捕获组会给你分开的数字。现在循环,我认为你别无选择
  • @Jay Blanchard - 问题不在于我已经完成的循环。如果是,我会发布它 - 它是一种更简单、更简单的方式将字符串分配到数组中。

标签: php arrays regex string


【解决方案1】:

为什么不呢?

$str = 'PT2M19S';
$i = new DateInterval($str);
print_r($i);

您可以使用结果对象的“i”和“s”属性

DateInterval Object
(
    [y] => 0
    [m] => 0
    [d] => 0
    [h] => 0
    [i] => 2
    [s] => 19
    [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
)

【讨论】:

  • AHHHHH 所以这就是 YouTube api 使用这种格式的原因,它使用 ISO 8601。我想知道他们在哪里提出了这种格式。 +1 为我回答另一个问题 :)
【解决方案2】:

改用这个正则表达式:

preg_match_all('/(\d+)([MS])/', $string, $matches, PREG_PATTERN_ORDER);

然后使用第二个捕获组作为键和第一个组作为值创建关联数组。

$result = array_combine($matches[2], $matches[1]);

【讨论】:

  • 知道必须有比我笨拙的解决方案更好的方法。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-07-18
  • 2015-06-07
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多