有条件的正则表达式或精确的位数

时间:2019-07-08 15:13:22

标签: php regex

我一直在努力与运营商or达成正则表达式。

例如 具有以下链: 允许的数字:1、2、5、6、20

“ / path / item / 1”

“ / path / item / 2”

“ / path / item / 5” 等

我正在测试的正则表达式是:

"/\/path\/item\/(1|2|5|6|20)/"

我想让正则表达式仅在为1或2或5或6等时返回true。

但是对于数字20的示例,正​​则表达式对于2而不是20返回true。

我如何独立验证每个值,也就是说,只有在值为2而不是20时,它才为真。但是,当值为20但不是2时,则为真。

正则表达式将如何实施此验证? Ejemplo

3 个答案:

答案 0 :(得分:1)

关键是要在捕获或非捕获组中首先添加大数字,例如:

^\/path\/item\/(20|1|2|5|6)$

^\/path\/item\/(?:20|1|2|5|6)$

\/path\/item\/(?:20|1|2|5|6)

测试

$re = '/^\/path\/item\/(20|1|2|5|6)$/s';
$str = '/path/item/20';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

var_dump($matches);

该表达式在this demo的右上角进行了说明,如果您想进一步探索或修改它,在this link中,您可以逐步观察它如何与某些示例输入匹配步骤,如果您愿意的话。

答案 1 :(得分:1)

您需要限制搜索,以使匹配的数字将您带到字符串的末尾:

"/\/path\/item\/(1|2|5|6|20)$/"

这将意味着数字必须完全匹配,并且不涉及对正则表达式中允许的值进行任何重新排序。

已展示的here

答案 2 :(得分:0)

您的代码存在问题,每当您发送20进行匹配时,2首先被匹配,由于后面还有0而被忽略。可以通过先给20来解决,例如:

\/path\/item\/(20|1|2|5|6)\/

在这里查看:https://regex101.com/r/aJf1Q8/1