【问题标题】:RegEx htaccess - Get each part of URL pathnameRegEx htaccess - 获取 URL 路径名的每一部分
【发布时间】:2016-12-25 00:32:20
【问题描述】:

我想创建一个 RewriteRule 来获取路径名 URL 的每个部分。

这是一个示例:

假设我称这个 URL 为:

127.0.0.1/service/param1/param2/param3/param4/param5/param6

我想用这个来转换这个调用:

127.0.0.1/index.php?s=service&p_1=param1&p_2=param2&p_3=param3&p_4=param4&p_5=param5&pa_6=param6

我尝试了很多不同的正则表达式,但不幸的是都没有成功。

这是我非常有信心的一个,但它失败了

RewriteRule ^(str)[/]?(.*)[/]?(.*)[/]?(.*)[/]?(.*)[/]?(.*)[/]?(.*)$ /index.php?s=$1&p_1=$2&p_2=$3&p_3=$4&p_4=$5&p_5=$6&p_6=$7 [L,NC,QSA]

任何帮助将不胜感激!

【问题讨论】:

  • 这些参数是可选的吗?
  • 几乎可以肯定没有这样的选项,但您可以使用 PHP 轻松做到这一点。只需 RewriteRule 将所有内容写入index.php 文件,然后在该 php 文件中进行拆分
  • 您的网址中没有str(service)[/]?(.*)[/]?(.*)[/]?(.*)[/]?(.*)[/]?(.*)[/]?(.*)$ 应该这样做。 / 也不需要在字符类中,您可能需要 /s 和介于两者之间的值。例如(service)/(.+?)/(.+?)/(.+?)/(.+?)/(.+?)/(.*)$.
  • @Sumurai8 是的,有。
  • @chris85 我要试试看!谢谢!

标签: php regex .htaccess url mod-rewrite


【解决方案1】:

由于您的参数是可选的,因此您希望将整个捕获组设为可选,而不仅仅是斜杠。为此,我们可以使用非捕获组。

RewriteRule ^([^/]+)(?:/([^/]*))?(?:/([^/]*))?(?:/([^/]*))?(?:/([^/]*))?(?:/([^/]*))?(?:/([^/]*))?(?:/([^/]*))?$ /index.php?service=$1&p1=$2&p2=$3&p3=$4&p4=$5&p5=$6&p6=$7&p7=$8 [L]

([^/]+) 捕获服务。它不是可选的,并且应该始终存在。 [^/] 部分匹配一个不是斜杠的字符......我们至少匹配一个,并且尽可能多地匹配。然后我们使用(?:/([^/]*))? 组来捕获每个参数。 ?: 语法将组标记为非捕获。内容不会用于$x 替换字符串。整个非捕获组后面的? 使其成为可选参数。稍后将使用内部捕获组进行替换。所有替换字符串都被某些东西替换。如果特定替换组没有任何匹配项,则将其替换为空字符串。

http://example.com/service/param1/param2/param3/ 之类的 url 将导致http://example.com/index.php?service=service&p1=param1&p2=param2&p3=param3&p4=&p5=&p6=&p7= 之类的 url。

如果要匹配超过 8 个可选参数,最好将请求传递给 php 路由器。如果您将键值对作为路径段,this answer 可能会对您有所帮助。

【讨论】:

  • 谢谢你!我知道了 !顺便欣赏一下正则表达式的解释。
猜你喜欢
  • 2011-10-20
  • 2011-12-15
  • 2010-12-28
  • 2019-07-22
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 2013-01-06
相关资源
最近更新 更多