在Regexp中断言捕获组仅出现一次

时间:2018-03-15 14:22:04

标签: php regex

你如何断言捕获组只出现一次,如果不是,那么整个句子都不匹配。

例如:

我有这个网址:

/prenoms/recherche?text=&gender=girl&trend=&origin=&begin=&rarity=veryrare&length=&theme=7&end=

如果提交的3种可能性(稀有|主题|趋势)中有2种或更多,我不想匹配我的网址。

我很难做到这样:

\/prenoms\/recherche?.*gender=(boy|girl)?.*(?<=rarity|theme|trend){1}=(\w+).*

但似乎无法在环顾中使用量词。

For testing purpose

1 个答案:

答案 0 :(得分:2)

我更喜欢使用内置语言功能而不是坚持使用正则表达式。基本上,您可以解析URL和查询字符串,然后使用array_intersect()

计算两个的交集
$parseURL = parse_url($url);
parse_str($parseURL['query'], $queryStrings);
var_dump(count(array_intersect(array_keys($queryStrings), ['rarity', 'theme', 'trend'])) < 2);

Live demo

但这是使用RegEx的问题的答案:

\A.*?[?&](rarity|theme|trend)=(?=.*[?&](?1)=)(*COMMIT)(*F)|.*

Live demo

我不确定,但这也有帮助:

preg_match_all("~[^$](rarity|theme|trend)=~", $url, $matches);
var_dump(count($matches[1]) < 2);