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

在逗号(和分隔符)之前和之后需要两个捕获组:

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

另外,我使用\dwhich 是数字的简写,而不是.*?, 这是任何东西。

我也删除t+了 for t,因为t+会匹配t一次或多次,这似乎不是您想要做的。

要使第二组可选,您将使用?修饰符:

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

但这仍然需要逗号。您也可以将其设为可选...

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

...但现在您的正则表达式将匹配:

{loadsegment 123,}

我们可能不想要。因此,我们将逗号包含在可选的第二组中,如下所示:

/{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 回答