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

php regex validate url fragment against list

我正在尝试根据允许的来源列表验证页面中的引荐来源网址。我在最后一个“/”之后提取了引荐来源 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_dumps:

----------------------------------------------------
$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 来转义点。

问题是您没有用括号括起来的字符串。

看到这个demo

更新:“。”例如在 view.php 中不会影响匹配