php 按第一个空格和连字符拆分格式化的时间范围表达式

olhwl3o2  于 2023-09-29  发布在  PHP
关注(0)|答案(4)|浏览(127)

我想把这个字符串拆分成3个数组元素。

$string = 'MW 01:00 PM - 02:30 PM';

输出量:

array[0] = MW
array[1] = 01:00 PM
array[2] = 02:30 PM

帮助我使用正则表达式,它将该字符串提取到数组中。

^[a-zA-Z\d-_]+$
lxkprmvk

lxkprmvk1#

您可以在空格处split,如果前面有digit,则可以使用lookahead

$arr = preg_split('/ +-? *(?=\d)/', $str);

See demo at regex101.com

bgtovc5b

bgtovc5b2#

<?php 

$str = "MW 01:00 PM - 02:30 PM";

$matches = [];

preg_match("/^([a-zA-Z]+)\s+(\d{1,2}:\d{1,2}\s+PM)\s+\-\s+(\d{1,2}:\d{1,2}\s+PM)$/",$str,$matches);

print_r($matches);

输出

Array
(
    [0] => MW 01:00 PM - 02:30 PM
    [1] => MW
    [2] => 01:00 PM
    [3] => 02:30 PM
)

说明:

  • 我们必须从头到尾匹配字符串。因此,我们在正则表达式的角上使用^$
  • ([a-zA-Z]+)\s+用于匹配字母字符沿着1个额外的空格。
  • \d{1,2}用于匹配1或2位时间(如10111等)

Regex demo

wwtsj6pe

wwtsj6pe3#

这也是有效的(但更长):

$str = "MW 01:00 PM - 02:30 PM";
preg_match('/([A-Z]{2}) ([0-9]{2}:[0-9]{2} [A-Z]{2}) - ([0-9]{2}:[0-9]{2} [A-Z]{2})/', $str, $match);

echo '<pre>' . print_r($match, true) . '</pre>';

输出量:

Array
(
    [0] => MW 01:00 PM - 02:30 PM
    [1] => MW
    [2] => 01:00 PM
    [3] => 02:30 PM
)
vu8f3i0k

vu8f3i0k4#

虽然you can split on sequences of one or more spaces and/or hyphens which are followed by a digit,但regex并不是唯一的选择。这是一个文本提取任务,而不是文本验证任务。看看sscanf()有多简洁。
当您有一个可预测格式且没有可选字符的字符串时,通常足够的sscanf()会有所帮助。%s(在scanf()printf()函数中)用于匹配可见字符(而不是空格)。%标记占位符的开始,(可选)下一个数字指定要匹配的字符数,然后字符类/否定字符类定义哪些字符将符合匹配条件。
代码:(Demo

$string = 'MW 01:00 PM - 02:30 PM';
var_export(
    sscanf($string, '%s %8[^-] - %8[^-]')
);

输出量:

array (
  0 => 'MW',
  1 => '01:00 PM',
  2 => '02:30 PM',
)

作为需求的扩展,如果希望将每个变量组件隔离为输出数组中的单独元素,请参见以下实现。
代码:(Demo

var_export(
    sscanf($string, '%s %2s:%s %s - %2s:%s %s')
);

输出量:

array (
  0 => 'MW',
  1 => '01',
  2 => '00',
  3 => 'PM',
  4 => '02',
  5 => '30',
  6 => 'PM',
)

--
要将小时和分钟子字符串转换为整数,请使用%d。(Demo

var_export(
    sscanf($string, '%s %d:%d %s - %d:%d %s')
);

相关问题