1

必要な値を返すpreg_matchの一部を取得できましたが、コンマの後にその文字列の後に続くものを返す正しい構文を取得できません。どんな援助もありがたいです-ありがとう

$regex = '{loadsegment+(.*?)}';
$input = '{loadsegment 123,789}';
preg_match_all($regex, $input, $matches, PREG_SET_ORDER);

現在の結果:

$matches [0] [0] {loadsegment 123}
             [1] 123,789

望ましい結果

$matches [0] [0] {loadsegment 123,789}
             [1] 123
             [2] 789
4

1 に答える 1

2

カンマ(および区切り文字)の前後に2つのキャプチャグループが必要です。

$regex = "/{loadsegment (\d+),(\d+)}/";

また、私は、何でもある\dのではなく、数字の省略形を使用しています。.*?

また、1回以上一致するt+ためt、削除しました。これは、やりたいこととは思えません。t+t

2番目のグループをオプションにするには、?修飾子を使用します。

/{loadsegment (\d+),(\d+)?}/

ただし、これにはまだコンマが必要です。オプションにすることもできます...

/{loadsegment (\d+),?(\d+)?}/

...しかし今あなたの正規表現は一致します:

{loadsegment 123,}

私たちはおそらくそれを望んでいません。したがって、次のように、オプションの2番目のグループにコンマを含めます。

/{loadsegment (\d+)(?:,(\d+))?}/

説明(区切り文字を除く):

{loadsegment   - Match "{loadsegment "
(\d+)          - Match one or more digits, store in capturing group 1
(?:            - Non-capturing group (so this won't be assigned a capturing group number
    ,          - Match a comma
    (\d+)      - Match one or more digits, store in capturing group 2
)
?              - Make the entire non-capturing group optional

RegExrでのデモ

于 2012-07-26T18:28:51.903 に答える