preg_match不包含最终可选匹配的值

时间:2018-10-29 16:04:41

标签: php

也许我做错了:我写了这个,等待正则表达式中包含可选匹配项。

preg_match('/^(\d+)([A-Z]+)?-(\d+)?([A-Z]+)?$/i', $groupe, $matches);
list($match, $debutChiffre, $debutLettre, $finChiffre, $finLettre) = $matches;

因此,匹配2、3和4是可选的。如果2为空但3不为空,则2将为空数组。但是最后一个可选项是否为空,没有$matches[4]。如果3和4都为空,则它在$matches[2]处停止。我本来希望为每个括号都留一个空字符串,因为在此之后,list()每次$matches[4]不存在时都会返回一条通知,因此它会尝试将不存在的值放入$finLettre

要删除这些通知,有没有比在list()之前添加此通知更好的方法了?

if (!isset($matches[4])) $matches[4] = "";

编辑:我虽然正则表达式就足够了,但是如果需要示例的话:

5A-9B将给出一个$matches数组,其中包含5个元素(完全匹配和4个括号)。

5-9B将给出一个包含5个元素的$matches数组($matches[2]是一个空字符串,因为没有字母)

5A-9将给出一个包含4个元素的$matches数组(preg_match会忽略最后一个不匹配的括号,而如果后面有至少一个匹配的术语与之保持一致,则会放置空字符串括号顺序)

5-将给出一个包含2个元素的$matches数组。

由于此行为,下一个list()将获得未设置的变量并因此而引起注意。

1 个答案:

答案 0 :(得分:1)

您可以合并$matches到具有默认值的数组。因此,如果匹配成功,它将替换默认值:

<?php
preg_match('/^(\d+)([A-Z]+)?-(\d+)?([A-Z]+)?$/i', $groupe, $matches);
$matches = $matches + [[], '', '', '', ''];
list($match, $debutChiffre, $debutLettre, $finChiffre, $finLettre) = $matches;

这样,您可以拥有没有警告的代码:)