请使用以下代码:
$target = 'NAME FUNC LPAREN P COMMA P COMMA P RPAREN';
//$target = 'NAME FUNC LPAREN P RPAREN';
//$target = 'NAME FUNC LPAREN RPAREN';
$pattern = '/(?P<ruleName>NAME )?(?P<funcName>FUNC )?(?:(?<=LPAREN)(?: (?P<arg1>P))|(?P<args>P)(?=(?: RPAREN)|(?: COMMA)))/';
preg_match_all($pattern,$target,$matches,PREG_OFFSET_CAPTURE|PREG_PATTERN_ORDER);
我需要在$ target中获得NAME,FUNC和每个P的位置(因此PREG_OFFSET_CAPTURE)。该模式适用于Ps,但它与命名组“ruleName”或“funcName”都不匹配。
我错过了什么?
感谢。
答案 0 :(得分:1)
我想我找到了原因。
(?<=LPAREN)
不会消耗字符串中的字符。P
s。但是必须放弃指定的群体才能发挥作用。我不确定你为什么需要这个后卫。 <怎么样
/(?P<ruleName>NAME )?(?P<funcName>FUNC )?(?:LPAREN )(?:(?P<arg1>P))|(?P<args>P)(?=(?: RPAREN)|(?: COMMA))/