Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP preg_匹配匹配某物或不匹配,并输出assoc数组_Php_Arrays_Preg Match_Associative - Fatal编程技术网

PHP preg_匹配匹配某物或不匹配,并输出assoc数组

PHP preg_匹配匹配某物或不匹配,并输出assoc数组,php,arrays,preg-match,associative,Php,Arrays,Preg Match,Associative,我正在使用以下代码: <?php $pattern = "/(?<item>.*)\:(?<value>.*)(\{(?<flag>.*)_(?<level>.*)\})/i"; $subject = "item:value{L_300}"; preg_match($pattern, $subject, $matches); print_r($matches); 我的问题是主题并不总是包含“{L_300}”部分,但我仍然需要使用该模式匹配“

我正在使用以下代码:

<?php
$pattern = "/(?<item>.*)\:(?<value>.*)(\{(?<flag>.*)_(?<level>.*)\})/i";
$subject = "item:value{L_300}";
preg_match($pattern, $subject, $matches);
print_r($matches);
我的问题是主题并不总是包含“{L_300}”部分,但我仍然需要使用该模式匹配“item:value”部分

有人能帮忙吗


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

您可以添加一个?在捕获组之后,将其设置为可选。我还随意改变了模式的其他部分,以防止在不寻常的情况下捕获过多的内容(例如有额外的:或{字符)


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


你确定你发布的图案正确吗?你发布的图案与“L_300”不匹配或者任何大括号,它只匹配冒号后的所有内容。您将获得
标志
级别
捕获,这在正则表达式中没有定义。对我来说似乎很神奇。这可能是错误的代码发布。抱歉,我已使用实际使用的模式更新了它。您确定发布了正确的模式吗?您发布的模式没有错误不要试图匹配“L_300”或任何大括号,它只匹配冒号后的所有内容。您将获得
标志
级别
捕获,这在正则表达式中没有定义。对我来说似乎很神奇。这可能是错误的代码。抱歉,我已使用实际使用的模式更新了它。
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'
    )
)
<?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
)