preg_match没有返回预期的结果

时间:2010-11-15 17:50:50

标签: php regex

我正在尝试使用regexp来解析不时可能包含特殊语法的搜索字符串。我正在寻找的语法是[特殊关键字:值],我希望每个匹配放入一个数组。请记住,搜索字符串将包含其他不打算解析的文本。

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

输出:

  

array(1){[0] => string(43)“[StartDate:2010-11-01] [EndDate:2010-11-31]”}

期望的输出:

  

array(2){[0] => string()“[StartDate:2010-11-01]”

     

[1] => string()“[EndDate:2010-11-01]”}

如果我不够清楚,请告诉我。

5 个答案:

答案 0 :(得分:4)

您的.+匹配两个[...]部分之间的边界,因为它匹配任何字符,并且尽可能多。您可以更严格地确定哪些字符可以匹配。 {1}也是多余的,可以删除。

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

应该更可靠地工作。

<强>解释

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

答案 1 :(得分: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]"
}

答案 2 :(得分:1)

此:

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

print_r($match);

给出了预期的结果,我不确定它是否与所有约束匹配。

答案 3 :(得分: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"
  }
}

答案 4 :(得分:0)

/\[.+?\:.+?\]/

我建议使用这种方法,不太复杂,但处理时与tim的相同