2010-06-13 53 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);

這將刪除前導空格。