Php preg_match未返回预期结果

Php preg_match未返回预期结果,php,regex,Php,Regex,我正在尝试使用regexp解析一个搜索字符串,该字符串可能不时包含特殊语法。我要找的语法是[special keyword:value],我希望将每个匹配放入一个数组中。请记住,搜索字符串将包含其他不需要解析的文本 $searchString = "[StartDate:2010-11-01][EndDate:2010-11-31]"; $specialKeywords = array(); preg_match("/\[{1}.+\:{1}.+\]{1}/&quo

我正在尝试使用regexp解析一个搜索字符串,该字符串可能不时包含特殊语法。我要找的语法是[special keyword:value],我希望将每个匹配放入一个数组中。请记住,搜索字符串将包含其他不需要解析的文本

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

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

期望输出:

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

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

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

请尝试以下操作:

$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]"
}
请尝试以下操作:

$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]"
}

您的
+
匹配跨越两个
[…]
部分之间的边界,因为它匹配任何字符,并且尽可能多的字符。您可以更严格地限制哪些字符可以匹配。另外,
{1}
是冗余的,可以删除

/\[[^:]*:[^\]]*\]/
应该能更可靠地工作

说明:

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

您的
+
匹配跨越两个
[…]
部分之间的边界,因为它匹配任何字符,并且尽可能多的字符。您可以更严格地限制哪些字符可以匹配。另外,
{1}
是冗余的,可以删除

/\[[^:]*:[^\]]*\]/
应该能更可靠地工作

说明:

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

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

此:

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

使用此正则表达式:
“/\[(.*?\:(.*?\)]{1}/”
,同时使用,它将返回

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"
  }
}
使用此正则表达式:
“/\[(.*?\:(.*?\]{1}/”
,并使用,它将返回

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"
  }
}
我建议使用这种方法,虽然不太复杂,但处理起来和tim的一样



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

量词
{1}
是无用的。量词
{1}
是无用的。他需要开始/结束日期,而不是2结束日期dates@Webnet是的,在复制/粘贴到答案之前,我应该先看一下输出。谢谢你的回复,我看到您提供的表达式存在的问题是,值并不总是Y-m-d格式。他需要开始/结束日期,而不是2结束日期dates@Webnet是的,在复制/粘贴到答案之前,我应该先看一下输出。谢谢你的回复,我发现您提供的表达式存在的问题是,值并不总是Y-m-d格式。谢谢您,这非常有效,我必须使用preg_match_all来正确构建数组,但表达式非常正确。再次感谢你,在解释中你会说得更详细一点。我很困惑
[^:::]*
=
如何匹配除:
之外的任意数量的字符。
[^::]*
是否匹配所有字符直到
,因为
在正则表达式中?@Derek Adair:
[^::]*
匹配尽可能多的非
字符,因此它匹配所有字符直到(但不包括)
。这种行为与正则表达式中是否有
跟随无关,但在这里它当然是有意义的。它还有助于尽可能快地匹配,因为正则表达式引擎从不需要回溯。因此[^something]*将匹配任何数量的非
something
字符,直到到达
something
?或多或少,是的<代码>[^abc]+表示匹配除
a
b
c
之外的一个或多个字符。因此,在
abcdefcba
中,它将匹配
def
。感谢您,这非常有效,我必须使用preg\u match\u all来正确构建数组,但表达式非常正确。再次感谢你,在解释中你会说得更详细一点。我很困惑
[^:::]*
=
如何匹配除:
之外的任意数量的字符。
[^::]*
是否匹配所有字符直到
,因为
在正则表达式中?@Derek Adair:
[^::]*
匹配尽可能多的非
字符,因此它匹配所有字符直到(但不包括)
。这种行为与正则表达式中是否有
跟随无关,但在这里它当然是有意义的。它还有助于尽可能快地匹配,因为正则表达式引擎从不需要回溯。因此[^something]*将匹配任何数量的非
something
字符,直到到达
something
?或多或少,是的<代码>[^abc]+表示匹配除
a
b
c
之外的一个或多个字符。因此,在
abcdefcba
中,它将匹配
def
。感谢您的回复,preg\u match\u all是一个缺少的组件,但另一个答案中的表达式更接近我想要的。感谢您的回复,preg_match_all是一个缺少的组件,但另一个答案的表达式更接近于我想要的。