命名正则表达式捕获具有特殊字符的组

时间:2015-06-19 14:23:10

标签: php regex symfony

我正在研究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。逃避行为不是正则表达式。同样的错误。

TL; DR

这让我想到了我的主要问题:

  

命名捕获组是否包含特殊字符,如dott?

PS:我知道,我永远不应该直接修改symfony核心文件,避免覆盖核心组件。 :)

对其他解决方案的任何建议?我的下一个想法是覆盖我想避免的路由组件。

1 个答案:

答案 0 :(得分:0)

正如@anubhava指出这根本不可能,为了解决这个问题,我只用一个可怕的愚蠢字符串替换.点。我不喜欢这个解决方案,但它确实有效。