我一直在努力与运营商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
答案 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)\/