我正在研究Symfony项目,我们特别需要点分隔的路由参数名称。听起来很简单,但我可能只是愚蠢的方式。
在通过symfony路由器组件搜索之后,我找到了匹配路由中参数的正则表达式:
// Symfony\Component\Routing\RouteCompiler::compilePattern
preg_match_all('#\{\w+\}#', $pattern, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
改变这种做法应该不行吗?所以我改变正则表达式也匹配点:
#\{[\w\.]+\}#
但现在我收到以下错误:preg_match(): Compilation failed: syntax error in subpattern name (missing terminator) at offset 17
让我们看一下生成的缓存文件:
if (preg_match("#^/movie/(?P<movie.year>[^/]++)/(?P<movie.title>[^/]++)/?$#s", $pathinfo, $matches)) {
我的第一个猜测是我可能不得不逃脱dott。
所以在Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper
里面我添加了一个preg_replace来逃避那个dott。逃避行为不是正则表达式。同样的错误。
这让我想到了我的主要问题:
命名捕获组是否包含特殊字符,如dott?
PS:我知道,我永远不应该直接修改symfony核心文件,避免覆盖核心组件。 :)
对其他解决方案的任何建议?我的下一个想法是覆盖我想避免的路由组件。
答案 0 :(得分:0)
正如@anubhava指出这根本不可能,为了解决这个问题,我只用一个可怕的愚蠢字符串替换.
点。我不喜欢这个解决方案,但它确实有效。