我正在尝试使用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]”}
如果我不够清楚,请告诉我。
答案 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的相同