PHP和Regex - 可选部分

时间:2012-08-20 16:11:44

标签: php regex

我遇到涉及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);

问题在于可选部分(例如最新文件 - &#34; 45D&#34;)  我需要这个结果:

D.SAE.IND.001.TME.BR.SER.20120729
$ result [&#39; fonte&#39;] =&#39; SAE&#39;
$ result [&#39; tipo&#39;] =&#39; IND&#39;
$ result [&#39; numberLevel&#39;] =&#39; 001&#39;
$ result [&#39;指标&#39;] =&#39; TME&#39;
$ result [&#39; nameLevel&#39;] =&#39; BR&#39;
$ result [&#39; group&#39;] =&#39; SER&#39;
$ result [&#39; op&#39;] =&#39;&#39;
$ result [&#39; id&#39;] =&#39; 20120729&#39;

D.SAE.LIS.008.AGE.APS.SER.45D.20120713
$ result [&#39; fonte&#39;] =&#39; SAE&#39;
$ result [&#39; tipo&#39;] =&#39; LIS&#39;
$ result [&#39; numberLevel&#39;] =&#39; 008&#39;
$ result [&#39;指标&#39;] =&#39;年龄&#39;
$ result [&#39; nameLevel&#39;] =&#39; APS&#39;
$ result [&#39; group&#39;] =&#39; SER&#39;
$ result [&#39; op&#39;] =&#39; 45D&#39;
$ result [&#39; id&#39;] =&#39; 20120713&#39;

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:8)

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

您可以对数组进行计数以查看条目数。如果是7,则表示您缺少可选字符串。

答案 1 :(得分: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组之前。

修改:添加?:以使分组无法捕获。