PHP preg_match匹配某物或全无并输出 assoc 数组


PHP preg_match match something or nothing and output assoc array

我使用以下代码:

<?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"部分。

有人可以帮忙吗?

这似乎是一个常见问题,但我找不到答案。

您可以在捕获组后添加 ? 以使其成为可选。我还冒昧地更改了模式的其他一些部分,以防止.*在异常情况下捕获太多(例如有额外的:或{字符)

<?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
)