2

我有一个涉及 PHP 和正则表达式的问题。

我有一些文件,需要捕获一些名称。但是有一部分不是全部。

示例文件:
D.SAE.IND.001.TME.BR.SER.20120729
D.SUI.IND.003.TMC.GER.TOT.201206
D.SAE.LIS.008.AGE.APS.SER.45D.20120713

请注意,最后一个文件有一部分(“45D”)是可选的。
我需要得到每个组。我正在使用以下正则表达式:

preg_match('/D\.(?P<font>[\w]*)\.(?P<tipo>[\w]*)\.(?P<numberLevel>[\d]*)\.(?P<indicator>[\w]*)\.(?P<nameLevel>[\w]*)\.(?P<group>[\w]*)\.(?P<id>[\d]*)/i', $arrInput , $result);

问题在于可选部分(例如最新文件-“45D”)。
我需要这个结果:

D.SAE.IND.001.TME.BR.SER.20120729
$result['fonte'] = 'SAE'
$result['tipo'] = 'IND'
$result['numberLevel'] = '001'
$result['indicator'] = 'TME'
$result['nameLevel'] = 'BR'
$result['group'] = 'SER'
$result['op'] = ''
$result[' id'] = '20120729'

D.SAE.LIS.008.AGE.APS.SER.45D.20120713
$result['fonte'] = 'SAE'
$result['tipo'] = 'LIS'
$result['numberLevel'] = '008'
$result['indicator'] = 'AGE'
$result['nameLevel'] = 'APS'
$result['group'] = 'SER'
$result['op'] = '45D'
$result['id' ] = '20120713'

提前感谢您的帮助。

4

2 回答 2

8

你为什么不直接使用explode('.', $string)

您可以计算数组以查看条目数。如果它是 7,您就知道您缺少可选字符串。

于 2012-08-20T16:13:51.777 回答
4

这对我有用:

/D\.(?P<font>[\w]*)\.(?P<tipo>[\w]*)\.(?P<numberLevel>[\d]*)\.(?P<indicator>[\w]*)\.(?P<nameLevel>[\w]*)\.(?P<group>[\w]*)\.(?:(?P<op>.*)\.)?(?P<id>[\d]*)/i

关键是添加:

(?:(?P<op>.*)\.)?

组前id

编辑:添加了?:使分组不被捕获。

于 2012-08-20T16:35:22.147 回答