2010-11-15 262 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
/\[.+?\:.+?\]/ 

我建议这种方法,不太复杂,但它处理同蒂姆