我想将这个字符串拆分为 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-_]+$
<?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
)
这也有效(但更长):
$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
)
正则表达式不是您唯一的选择。这是文本提取任务,而不是文本验证任务。看起来多么简洁
sscanf()
。
当您的字符串具有可预测的格式且没有可选字符时,
sscanf()
通常会很有帮助。 %s
(在 scanf()
和 printf()
函数中)用于匹配可见字符(不是空格)。 %
标记占位符的开始,(可选)下一个数字指定要匹配的字符数,然后字符类/否定字符类定义哪些字符将符合匹配条件。
代码:(演示)
$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',
)
作为需求的扩展,如果需要将每个变量分量隔离为输出数组中的单独元素,请参阅以下实现。
代码:(演示)
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
。 (演示)
var_export(
sscanf($string, '%s %d:%d %s - %d:%d %s')
);