2010-11-15 159 views
1

我試圖用正則表達式來解析一個搜索字符串,它可能會包含特殊的語法。我正在尋找的語法是[特殊關鍵字:值],我希望每個匹配放入一個數組。請記住,搜索字符串將包含不打算分析的其他文本。preg_match不返回預期的結果

$searchString = "[StartDate:2010-11-01][EndDate:2010-11-31]"; 
$specialKeywords = array(); 
preg_match("/\[{1}.+\:{1}.+\]{1}/", $searchString, $specialKeywords); 
var_dump($specialKeywords); 

輸出:

陣列(1){[0] =>串(43) 「[開始日期:2010-11-01] [結束日期:2010年11月31日]」}

所需的輸出:

陣列(2){[0] =>串() 「[開始日期:2010-11-01]」

[1] => string()「[EndDate:2010-11-01]」}

請讓我知道如果我不夠清楚。

+1

的量詞'{1} '沒用。 – Gumbo 2010-11-15 17:56:48

回答

4

.+兩個[...]部分之間跨越邊界的比賽,因爲它匹配任何字符,並且因爲其中許多儘可能。你可能會限制哪些字符可以匹配。 {1}也是多餘的,可以丟棄。

/\[[^:]*:[^\]]*\]/ 

應該更可靠地工作。

說明:

\[  # match a [ 
[^:]* # match any number of characters except : 
:  # match a : 
[^\]]* # match any number of characters except ] 
\]  # match a ] 
+0

謝謝你完美的工作,我不得不使用preg_match_all來正確地建立數組,但表達式是現貨。再次感謝 – 2010-11-15 18:07:06

+0

您可以進入解釋中的更多細節。我很困惑'[^:] *'='如何匹配任何數量的字符,除了:'。因爲':'在正則表達式中,'[^:] *'是否匹配所有字符直到':'? – 2010-11-15 18:32:54

+0

@Derek Adair:'[^:] *'儘可能匹配儘可能多的非':' - 字符,因此它匹配所有字符(但不包括):'。這種行爲與在正則表達式中是否存在':'無關 - 但當然這是有意義的。它也有助於儘可能快地匹配,因爲正則表達式引擎永遠不必回溯。 – 2010-11-15 20:35:39

1

嘗試以下操作:

$searchString = "[StartDate:2010-11-01][EndDate:2010-11-31]"; 
$specialKeywords = array(); 
preg_match_all("/\[\w+:\d{4}-\d\d-\d\d\]/i", $searchString, $specialKeywords); 

var_dump($specialKeywords[0]); 

輸出:

array(2) { 
    [0]=> 
    string(22) "[StartDate:2010-11-01]" 
    [1]=> 
    string(20) "[EndDate:2010-11-31]" 
} 
+0

他需要開始/結束日期,而不是2結束日期 – Webnet 2010-11-15 17:59:12

+0

@Webnet Yeeea,我應該*看*輸出之前我複製/粘貼到答案。 – meagar 2010-11-15 18:00:36

+0

謝謝你的迴應,我看到你提供的表達式的問題是,該值不會總是以Y-m-d格式。 – 2010-11-15 18:09:35

1

此:

$searchString = "[StartDate:2010-11-01][EndDate:2010-11-31]"; 
preg_match_all('/\[.*?\]/', $searchString, $match); 

print_r($match); 

給出了預期的結果,我不知道是否所有的約束相匹配。

+0

謝謝你的迴應,preg_match_all是一個缺少組件,但從另一個答案的表達更接近我所期待的。 – 2010-11-15 18:08:19

0

使用這個表達式:"/\[(.*?)\:(.*?)\]{1}/",還可以使用preg_match_all,它將返回

array(3) { 
    [0]=> 
    array(2) { 
    [0]=> 
    string(22) "[StartDate:2010-11-01]" 
    [1]=> 
    string(20) "[EndDate:2010-11-31]" 
    } 
    [1]=> 
    array(2) { 
    [0]=> 
    string(9) "StartDate" 
    [1]=> 
    string(7) "EndDate" 
    } 
    [2]=> 
    array(2) { 
    [0]=> 
    string(10) "2010-11-01" 
    [1]=> 
    string(10) "2010-11-31" 
    } 
} 
0
/\[.+?\:.+?\]/ 

我建議這種方法,不太複雜,但它處理同蒂姆