使用PHP构建可变正则表达式段的变化列表

时间:2011-07-13 21:27:17

标签: php regex

我正在尝试将可选段添加到我编写的路由引擎中。我可以处理单个可选段:

'/user/(:num?)'

获取翻译为:

'/user(?:/([0-9]+))?'

但是,我不确定如何处理任意数量的可选段:

'/user/(:num?)/(:num?)'

应该翻译成:

'/user(?:/([0-9]+)(?:/([0-9]+))?)?'

显然,正则表达式随着添加的每个可选段变得越来越复杂。有没有办法在PHP中完成这个翻译,以便允许任意数量的可选参数?

修改

这是我提出的解决方案:

$replacements = 0;

$route = str_replace(array('/(:num?)', '/(:any?)'), array('(?:/([0-9]+)', '(?:/([a-zA-Z0-9\-_]+)'), $route, $replacements);
$route .= implode('', array_fill(0, $replacements, ')?'));

2 个答案:

答案 0 :(得分:1)

在/上使用split()然后遍历数组。

http://php.net/manual/en/function.split.php

答案 1 :(得分:0)

我会创建一个消耗路由网址的固定部分的解析器,然后它会创建一个正则表达式“上下文”,比如一个列表来存储以下每个模式。之后你横向将列表添加到类似“(< pattern1>< pattern2>)”的列表中?“。

至少我会如何开始解决这个问题。