在重写正则表达式之后 PHP 不读取第二个 $_GET 变量

Posted

技术标签:

【中文标题】在重写正则表达式之后 PHP 不读取第二个 $_GET 变量【英文标题】:PHP doesn't read the second $_GET variable after rewriterule regex 【发布时间】:2015-12-09 07:03:32 【问题描述】:

这是我的重写规则

我的链接看起来像 3.5 或 1.0.0.315 3.05 等

RewriteRule ^([0-9]+\.([0-9]+)?[^a-zA-Z]+)$ index.php?Patch_No=$1 [NC,L]

下面我的链接应该是 3.5&items 3.5&champions 1.0.0.315&items etc.

RewriteRule ^([0-9]+\.([0-9]+)?[^a-zA-Z]+)&([a-zA-Z_-]+)$ index.php?Patch_No=$1&tab=$2 [NC,L]

我确实得到了 $_GET['Patch_No'] ,但我没有得到 $_GET['tab'] 由于某种原因从未设置此变量。

这样就可以正常使用了

^([0-9]+\.[0-9]+[^a-zA-Z]+)$

但它与 3.5 不匹配,它仅适用于 3.05 3.26 1.0.0.125 等数字,但我需要它与 3.5 一起使用,所以我添加了

^([0-9]+\.([0-9]+)?[^a-zA-Z]+)

它适用于我在上面发布的第一个 RewriteRule,但它不适用于带有选项卡变量的第二个

这里还有 var_dump($_GET);

array (size=2)
  'Patch_No' => string '3.5' (length=3)
  'tab' => string '' (length=0)

【问题讨论】:

【参考方案1】:

这是我看到的。

    您的链接必须看起来像您想要作为变量传递的内容。如果您想传递两个变量,那么您的链接应类似于 /3.05/items1.0.0.315/champions 重写规则不理解“等”的含义。它们非常精确。他们要么匹配正则表达式,要么不匹配。因此,您必须在创建它们时具体说明您希望它们做什么。

这些是您正在寻找的规则

RewriteRule    ^([0-9]+).([0-9]+)$    index.php?Patch_No=$1    [NC,L,QSA] # allows two sets of numbers
RewriteRule    ^([0-9]+).([0-9]+)&([A-Za-z]+))$    index.php?Patch_No=$1    [NC,L,QSA] # allows two sets of numbers & text
RewriteRule    ^([0-9]+).([0-9]+).([0-9]+).([0-9]+)$    index.php?Patch_No=$1    [NC,L,QSA] # allows 4 sets of numbers
RewriteRule    ^([0-9]+).([0-9]+).([0-9]+).([0-9]+)&([A-Za-z]+)$    index.php?Patch_No=$1    [NC,L,QSA] # allows 4 sets of numbers & text

我为您提供了两组数字和四组数字的查询规则,因为这些是您在问题中给我们的示例。

但是,您可以通过在规则中添加或删除.([0-9]+) 来制作任意数量的内容。

【讨论】:

我希望链接看起来像 3.05&items 并且它在我发布的代码中工作得很好,除了 3.5 并且我的正则表达式必须是精确的,因为我对此文件也几乎没有其他重写规则

以上是关于在重写正则表达式之后 PHP 不读取第二个 $_GET 变量的主要内容,如果未能解决你的问题,请参考以下文章

php正则判断手机号码的方法

正则表达式 - 匹配第二个逗号(或逗号和空格)之后的所有内容

正则表达式(/[^0-9]/g,'')中的"/g"是啥意思 ?????

Linux基础-sed+正则表达式

PHP的正则表达式

实战JS正则表达式