2010-02-23 129 views
0

解釋我的問題的最好方法是向您展示。在PHP中使用簡單正則表達式的問題

輸入字符串:

/04-11-2010/12:45/ 

正則表達式來獲取日期和時間部分:

preg_match('@/(\d\d)-(\d\d)-(\d\d\d\d)/(\d\d):(\d\d)/@', $input, $matches); 

PHP匹配陣:

Array 
(
    [0] => /01-11-2010/12:45/ 
    [1] => 01 
    [2] => 11 
    [3] => 2010 
    [4] => 12 
    [5] => 45 
) 

現在,上面的正則表達式可以完美地獲取表示輸入字符串中日期和時間的各個組件部分。

問題是時間部分需要是可選的,而不必關閉整個正則表達式。

問題輸入字符串:

/04-11-2010// 

PHP匹配陣列

Array 
(
) 

基本上我有什麼需要通過比賽陣列返回是:

Array 
(
    [0] => /01-11-2010/12:45/ 
    [1] => 01 
    [2] => 11 
    [3] => 2010 
    [4] => 
    [5] => 
) 

注ARR ay元素4和5仍然需要存在但返回空。

+0

我太遲了!來吧,你不需要這樣的正則表達式;) – Rowlf 2010-02-24 00:23:47

+0

@Rowlf其實日期的使用只是一個例子。實際上,我得到了一個更大的輸入字符串,它需要一個正則表達式來提取所有數據。我只需要知道如何捕捉一個組,即使它不匹配。 – Camsoft 2010-02-24 00:38:25

+0

@Camsoft Fair夠:) – Rowlf 2010-02-24 01:06:41

回答

2

使用問號運算符和非捕獲組使東西可選。

@/(\d\d)-(\d\d)-(\d\d\d\d)/(?:(\d\d):(\d\d))?/@ 

我不知道該如何與對手陣交互 - 如果具有空數組元素絕對是至關重要的,你可能需要而不是去

@/(\d\d)-(\d\d)-(\d\d\d\d)/((?:\d\d)?):?((?:\d\d)?)/@ 

有它自己的假肯定(當時的冒號現在是可選的)。

+0

現貨!第二個正則表達式工作完美 – Camsoft 2010-02-24 00:13:57

1

使所述第二部分可選的:

'@/(\d\d)-(\d\d)-(\d\d\d\d)/(?:(\d\d):(\d\d))?/@' 

這裏非捕獲組(?:…)使用不能被引用,因此不改變匹配的基團。

+0

如果你這樣做了,第一個(在/之後會生成一個新的數組入口,不是嗎?或者說是什麼?(在/之後?是英文? – Sniggerfardimungus 2010-02-24 00:00:47

+0

否,它不會,這就是什麼?:確實 - 它使它成爲一個非捕獲組,它意味着一個組可以用來使它成爲可選的(在這種情況下)或重複等,但它不會作爲返回值的一部分被捕獲 – 2010-02-24 00:09:11

+0

關鍵是,[4]和[5]應該在那裏 – user187291 2010-02-24 00:13:39

0

我不是一個PHP的頭,但如何:

preg_match('@/(\d\d)-(\d\d)-(\d\d\d\d)/(\d\d)?:?(\d\d)?/@', $input, $matches); 

至於正則表達式去,應該與沒有時間字段的字符串。

1
@/(\d\d)-(\d\d)-(\d\d\d\d)/((?:\d\d)?):?((?:\d\d)?)/@ 

做你想做的事情(即,填充組4和5),但也接受不完整的幾次都是在

/04-11-2010/12:/ 

不知道這是否是細跟你

0

@OP,不需要亂七八糟的正則表達式。

$str="/04-11-2010/12:45/"; 
$s = array_filter(explode('/',$str)); 
$date=$s[1]; 
$time=$s[2]; 
$date_parts=explode("-",$date); 
$time_parts=explode(":",$time); 
if (checkdate($date_parts[1],$date_parts[0],$date_parts[2])){ 
    print "date ok\n"; 
} 
+0

好吧,我們將使用凌亂的PHP代替 – Camsoft 2010-02-25 14:18:21

+0

don' t告訴我你不明白它在做什麼? – ghostdog74 2010-02-25 14:46:30

0

使用本機PHP函數執行此任務,使用正則表達式有點矯枉過正。

PHP 5有date_parse功能:

$string = '/04-11-2010/12:45/'; 
$dateArray = date_parse(str_replace('/', ' ', $string)); 
print_r($dateArray); 

$string = '/04-11-2010//'; 
$dateArray = date_parse(str_replace('/', ' ', $string)); 
print_r($dateArray); 

輸出:

Array 
(
    [year] => 2010 
    [month] => 11 
    [day] => 4 
    [hour] => 12 
    [minute] => 45 
    [second] => 0 
    [fraction] => 0 
    [warning_count] => 0 
    [warnings] => Array 
     (
     ) 

    [error_count] => 0 
    [errors] => Array 
     (
     ) 

    [is_localtime] => 
) 

Array 
(
    [year] => 2010 
    [month] => 11 
    [day] => 4 
    [hour] => 
    [minute] => 
    [second] => 
    [fraction] => 
    [warning_count] => 0 
    [warnings] => Array 
     (
     ) 

    [error_count] => 0 
    [errors] => Array 
     (
     ) 

    [is_localtime] => 
) 

PHP 5.3有着更靈活的date_parse_from_format功能,你也可以使用。

+0

感謝你們這樣做,但這看起來更像是一個簡單的正則表達式,但最終一個好的正則表達式會更加健壯和靈活。 – Camsoft 2010-02-25 14:20:18