我正在尝试将可选段添加到我编写的路由引擎中。我可以处理单个可选段:
'/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, ')?'));
答案 0 :(得分:1)
在/上使用split()然后遍历数组。
答案 1 :(得分:0)
我会创建一个消耗路由网址的固定部分的解析器,然后它会创建一个正则表达式“上下文”,比如一个列表来存储以下每个模式。之后你横向将列表添加到类似“(< pattern1>< pattern2>)”的列表中?“。
至少我会如何开始解决这个问题。