我使用以下代码:
<?php
$pattern = "/(?<item>.*)\:(?<value>.*)(\{(?<flag>.*)_(?<level>.*)\})/i";
$subject = "item:value{L_300}";
preg_match($pattern, $subject, $matches);
print_r($matches);
将输出以下内容:
array(
array (
0 => 'item:value{L_300}',
'item' => 'item',
1 => 'item',
'value' => 'value',
2 => 'value',
3 => '{L_300}',
'flag' => 'L',
4 => 'L',
'level' => '300',
5 => '300'
)
)
我的问题是主题并不总是包含'{L_300}'部分,但我仍然需要使用模式匹配'item:value'部分。
任何人都可以帮忙吗?
这似乎是一个常见问题,但我找不到答案。
答案 0 :(得分:1)
你可以加一个?在捕获组之后使其可选。我也冒昧地改变模式的其他部分以防止。*在异常情况下捕获太多(例如,有额外的:或{字符)
<?php
$pattern = "/(?<item>[^:]*):(?<value>[^{]*)(\{(?<flag>[^_]*)_(?<level>[^}]*)\})?/i";
$subjects = array("itemname:valuehere{L_300}",
"item2:anothervalue"
);
foreach ($subjects as $subject) {
print "Subject:\n$subject\n";
preg_match($pattern, $subject, $matches);
print_r($matches);
}
输出:
Subject:
itemname:valuehere{L_300}
Array
(
[0] => itemname:valuehere{L_300}
[item] => itemname
[1] => itemname
[value] => valuehere
[2] => valuehere
[3] => {L_300}
[flag] => L
[4] => L
[level] => 300
[5] => 300
)
Subject:
item2:anothervalue
Array
(
[0] => item2:anothervalue
[item] => item2
[1] => item2
[value] => anothervalue
[2] => anothervalue
)