如何使用重复的正则表达式提取数据?

时间:2013-01-28 22:39:12

标签: regex mod-rewrite pattern-matching repeat

所以我现在正在研究重写规则,我基本上想要做以下事情:

\/([\w+-]+)\/([\w+-]+)\/([\w+-]+)\/([\w+-]+)\/([\w+-]+)...

正如你所看到的,我想要一遍又一遍地匹配相同的模式,我可以写出来,但多次适合我目前的目的,但那不是很优雅。由于每次捕获都是相同的模式,如果可以以任意方式编写它会很好,如下所示:

(?:\/([\w+-]+))+

然后理想情况下,我可以按如下方式分配重写:

$1.php?one=$2&two=$3...

任何人都知道这是否可行?可能不会,但从来没有伤害过要求。

1 个答案:

答案 0 :(得分:0)

这个想法被称为repeated capture group,但这是不可能的。想象一下:([\w+-]+)的捕获字符放在一个缓冲区中,第二个匹配只是覆盖第一个。

一个实用的解决方案是捕获整个事物,并在php(或任何其他服务器端脚本)中处理它:

RewriteRule (.*) index.php?req=$1

然后在PHP中:

list($_GET['one'], $_GET['two'], $_GET['three']) = explode('\', $_GET['req'])

或者......好吧,这是非常不切实际的,但你可以通过使用递归来使用mod_rewrite:每次迭代都会识别最后一个段,将它传递给query_string等。它在生产中不起作用(如Apache sanely将递归限制设置为低值),但它提醒我mod_rewrite是图灵完成的。