2010-06-13 57 views
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); 
?> 

返回:PHP使preg_split W /正则表达式

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. 

我能做些什么?

+0

你可以发布使用的正则表达式吗? – 2010-06-13 20:08:47

回答

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); 
+0

非常感谢。完美的作品。 – user359294 2010-06-13 20:33:52

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); 

希望这有助于!

+0

':'在正则表达式中不是特殊字符。另外,请不要在PHP正则表达式中反转反斜杠,否则你会结束一个文字反斜杠。 – 2010-06-13 20:30:18

+0

我的错误,'?:'语法让我假设它是。 – DuFace 2010-06-13 20:32:27

0

或者:

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

这将删除前导空格。