php正则表达式根据列表验证url片段

php正则表达式根据列表验证url片段,php,regex,validation,Php,Regex,Validation,我试图根据允许的来源列表验证页面中的推荐人。我已经提取了在最后一个“/”之后的推荐人URL部分,现在想对照有效来源列表检查它。有效片段的格式为[filename][?id=nnn],不允许使用其他字符,例如“view.php?id=1”可以,而“view.php?id=1&nasty=1”无效 我尝试的方法是: $fragOK = preg_match('/'.implode('|', $okSrc).'\?id=[0-9]+$/', $frag); 其中,$okSrc是有效源文件名的数组,$

我试图根据允许的来源列表验证页面中的推荐人。我已经提取了在最后一个“/”之后的推荐人URL部分,现在想对照有效来源列表检查它。有效片段的格式为[filename][?id=nnn],不允许使用其他字符,例如“view.php?id=1”可以,而“view.php?id=1&nasty=1”无效

我尝试的方法是:

$fragOK = preg_match('/'.implode('|', $okSrc).'\?id=[0-9]+$/', $frag);
其中,$okSrc是有效源文件名的数组,$frag是提取的字符串。显然这有点不对劲,因为我上面给出的两个例子的$fragOK==1。谁能解释一下我哪里出了问题吗

使用var_转储更新:

----------------------------------------------------
$okSrc
----------------------------------------------------
array(4) {
  [0]=>
  string(8) "view.php"
  [1]=>
  string(10) "detail.php"
  [2]=>
  string(11) "request.php"
  [3]=>
  string(12) "overview.php"
}

----------------------------------------------------
$frag
----------------------------------------------------
string(21) "view.php?id=1&nasty=1"

将脚本放入组中:

$fragOK = preg_match('/(?:'.implode('|', $okSrc).')\?id=[0-9]+$/', $frag);
//              here __^^^                  and __^

您可能还需要在$okStr上使用
preg_quote
来转义这些点。

问题在于您没有用括号括起来的字符串

看到这个了吗


更新:'.'例如,在view.php中不会影响匹配

能否给出一个有效源文件名的小样本列表?问题中有一个示例(view.php),但其他有效文件名是detail.php、request.php、overview.php。我是用数组做的,因为我想用一种简单的方法在将来添加更多。谢谢,但仍然不清楚要匹配的URL是什么样子,在调用preg_matchUpdated之前,你能用var_dump$okSrc和$frag更新这个问题吗。显示的片段应该无效。谢谢,请参阅下面的答案感谢您花时间回答,但我恐怕不知道如何阅读您链接的演示-我不是正则表达式的普通用户。下面来自JE SUIS CHARLIE的答案非常有效。事实上,如果你看到链接右上方的解释部分,你就可以用普通英语解释整个正则表达式。当你开始学习正则表达式的时候,真是太棒了。谢谢。我已经为这个网站添加了书签,下次需要正则表达式时,我会尝试使用它。谢谢。我很高兴看到我是多么的接近,并且学到了一些新的东西。非常感谢。为什么?:,他需要匹配列表中的文件名,添加括号就足够了,文件名中的点应该不会起作用,但为了安全起见,建议使用preg_quote。@karmendra:因为你不需要捕获,所以速度更快。请参阅他的$okSrc数组,如果$frag是view.php?id=1,那么它就是一个匹配项。如果$frag是somethingelse.php?id=1,那么它将与您的模式匹配,我认为它不应该匹配。@karmendra:对不起,我不明白您的意思。你想说什么?