Mod_Rewrite有助于理解这个表达式

时间:2011-03-27 05:27:42

标签: regex mod-rewrite

RewriteRule ^user/(\w{1,50})\-\-(\w{1,50})\-(\w{1,50})\.html users.php?name=$1 [L]

url看起来像这样

site.com/user/first-middle-last.html

由于某种原因,users.php中的变量$ _GET ['name']只返回第一个名称部分而不是整个第一个中间和最后一个,如何使其处理全名为var var

2 个答案:

答案 0 :(得分:3)

你的正则表达式有3个捕获组:

^user/(\w{1,50})-(\w{1,50})-(\w{1,50})\.html
      \________/ \________/ \________/
          $1         $2         $3

$1是第一个捕获:(\w{1,50})的群组。如果您想要整个文本,请尝试:

RewriteRule ^user/(\w{1,50}-\w{1,50}-\w{1,50})\.html users.php?name=$1 [L]
                  \__________________________/
                              $1

此外,请注意,您不必在字符集(-)之外转义破折号([...]),并且在第一个和第二个单词之间有两个破折号。

如果您需要,您可以两种方式 - 捕获每个单词和整个名称:

^user/((\w{1,50})-(\w{1,50})-(\w{1,50}))\.html
      |\________/ \________/ \________/|
      |    $2         $3         $4    |
      \________________________________/
                      $1

答案 1 :(得分:1)

每个$n引用一个带括号的组。在这种情况下,$1代表第一个(\w{1,50});其余的被困在$2$3。假设双连字符实际上应该映射到单个连字符(这在您的示例中不明确),您可能想要

RewriteRule ^user/(\w{1,50})\-\-(\w{1,50})\-(\w{1,50})\.html users.php?name=$1-$2-$3 [L]

如果这是一个错误并且您确实希望重写整个first--middle-last表达式,那么@ Kobi的答案比删除它并重新加入更正确。