1

私は次のコードを使用しています:

<?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」の部分を一致させる必要があります。

誰か助けてもらえますか?

これはよくある質問のように思えるかもしれませんが、答えが見つかりませんでした。

4

1 に答える 1

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
)
于 2012-06-27T23:36:42.753 に答える