php preg_split w / regex

时间:2010-06-13 20:06:48

标签: php regex array-population

<?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.

我该怎么办?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

<?php
$str = '17:30 Football 18:30 Meal 20:00 Quiet';
$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);

希望这有帮助!

答案 2 :(得分:0)

或者:

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

这将删除前导空格。