Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重写引擎:URL中的查询无法正常工作。也许Regex错了?_Regex_.htaccess_Mod Rewrite - Fatal编程技术网

重写引擎:URL中的查询无法正常工作。也许Regex错了?

重写引擎:URL中的查询无法正常工作。也许Regex错了?,regex,.htaccess,mod-rewrite,Regex,.htaccess,Mod Rewrite,我有这样一个url: index.php?lang=de&menu=products&sub1=heat&sub2=M123 RewriteRule ^(de|at|ch|it|nl)/?(.*)/?(.*)/?(.*)$ index.php?lang=$1&menu=$2&sub1=$3&sub2=$4 只有字段“lang”是必填字段,因此my.htaccess如下所示: index.php?lang=de&menu=products

我有这样一个url:

index.php?lang=de&menu=products&sub1=heat&sub2=M123
RewriteRule ^(de|at|ch|it|nl)/?(.*)/?(.*)/?(.*)$ index.php?lang=$1&menu=$2&sub1=$3&sub2=$4
只有字段“lang”是必填字段,因此my.htaccess如下所示:

index.php?lang=de&menu=products&sub1=heat&sub2=M123
RewriteRule ^(de|at|ch|it|nl)/?(.*)/?(.*)/?(.*)$ index.php?lang=$1&menu=$2&sub1=$3&sub2=$4
当我读$\u GET时,我得到了下面的代码…但是我想填充所有变量

[lang] => at
[menu] => products/heat/M123
[sub1] => 
[sub2] => 

这是我第一次使用regex和rewriteengine。对于这个可能很愚蠢的问题,我深表歉意。

请使用相同的替换字符串尝试以下操作:

^(de|at|ch|it|nl)(?:/([^/]*))?(?:/([^/]*))?(?:/([^/]*))?$
因此:


解释

*
是贪婪的,因为第一个
*
后面的字符都不必匹配(
/?
和剩余的
*
都可以不匹配任何内容),所以它会立即匹配字符串的其余部分,而所有其他组最终都是0长度匹配

通常,通过设置一个
*
惰性-
*?
,可以解决问题,但在这种情况下(我通过失败的测试发现),惰性量词仍然会匹配字符串的结尾,因为它似乎需要一些具体的匹配,显然,匹配可选的
/
不足以优先

为了解决这个问题,我将
/?.
替换为
(?:/([^/]*))?

(?:…)
仅表示不捕获此组(如$1$2等)

因此忽略每个组都有
(/([^/]*)?

每个组都是可选的,并且必须匹配一个
/
,后跟0个
非-/
字符。通过这种方式,你可以确保*不会贪婪地消费下一组

一个稍微短一点的正则表达式(我的原始正则表达式)也可以使用,但有点难以解释:

^(de|at|ch|it|nl)(?:/(.*?))?(?:/(.*?))?(?:/(.*?))?$

它可以工作…但是当我这样做:/de/products/heat…以及当我这样做/de/products或这个/de/products/时,页面无法找到。