2012-07-26 20 views
1

我已经设法获得preg_match的一部分,返回我需要的值,但无法获得正确的语法以返回后面后面的逗号。任何援助表示赞赏 - 感谢带空格和逗号分隔符的preg_match_all

$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 

回答

2

你们两个拍摄组之前和逗号(和分隔符)后,需要:

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

此外,我使用\d这是一个数字的简写,而不是.*?,这是任何东西。

我也删除t+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 

Demo at RegExr

+0

示例学习的缺点,哈哈.. 。 – GDP 2012-07-26 18:30:57

+1

当我看到正确的语法正则表达式时,它总是显得那么容易... – GDP 2012-07-26 18:32:31

+0

@GDP - 你很近!你越用它,你就越熟悉它。 – nickb 2012-07-26 18:33:27