Php preg_match未返回预期结果
我正在尝试使用regexp解析一个搜索字符串,该字符串可能不时包含特殊语法。我要找的语法是[special keyword:value],我希望将每个匹配放入一个数组中。请记住,搜索字符串将包含其他不需要解析的文本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
$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是一个缺少的组件,但另一个答案的表达式更接近于我想要的。