1
<?php
$str = '17:30 Football 18:30 Meal 20:00 Quiet';
$chars = preg_split('/^([0-1][0-9]|[2][0-3]):([0-5][0-9])$/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r ($chars);
?> 

回来:

Array ( 
  [0] => Array ( 
    [0] => 17:30 Football 18:30 Meal 20:00 Quiet 
    [1] => 0 
  ) 
) 

虽然我希望:

Array ( 
  [0] => Array ( 
    [0] => Football
    [1] => 7 
  ) 
  [1] => Array ( 
    [0] => Meal 
    [1] => 22 
  ) 

  etc.

我能做些什么?

4

3 回答 3

1

您需要放下锚点^$围绕您的正则表达式 - 将它们放在适当的位置,正则表达式永远无法匹配,因为它们要求拆分字符串从字符串的开头开始并在字符串的结尾结束 - 这永远不会是真的,除非你的输入17:30只是。

您可能还想在正则表达式中包含空格字符,例如

$chars = preg_split('/\s*([0-1][0-9]|2[0-3]):([0-5][0-9])\s*/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
于 2010-06-13T20:27:46.117 回答
0

在正则表达式中,^$符号分别是您正在扫描的文本行的开头和结尾的锚点。尝试将它们从您的图案中移除。也许尝试类似:

<?php
$str = '17:30 足球 18:30 用餐 20:00 安静';
$chars = preg_split('/(?:[01]\d|2[0-3]):(?:[0-5]\d)/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r ($chars);
?>

不要忘记这:是正则表达式中的特殊字符,因此需要对其进行转义。

默认情况下,所有带括号的组都会被记住,但您可以使用?:语法停止它。我不完全确定这是否会导致 PHP 出现问题,因为我使用 Python 测试了表达式,但它应该会阻止在数组中返回匹配项。

您可能还想稍微扩展表达式以自动去除单词周围的空格:

$chars = preg_split('/\s*(?:[01]\d|2[0-3]):(?:[0-5]\d)\s*/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);

希望这可以帮助!

于 2010-06-13T20:28:25.217 回答
0

或者:

$chars = preg_split('/\b[0-9:\s]{6,7}\b/', $str,-1,PREG_SPLIT_OFFSET_CAPTURE);

这将删除前导空格。

于 2010-06-13T21:24:26.813 回答