需要特定正则表达式部分的解释->“ [^ \}]”

时间:2018-07-17 23:38:54

标签: php regex

我目前正在关注有关PHP MVC框架的一些教程,以更好地理解PHP实现。在教程中的某一时刻,添加了正则表达式以从路由器组件的URL中提取自定义变量。正则表达式的目标是提取变量名和变量值,而值是另一个正则表达式。

添加了正则表达式:

"/\{([a-z-]+):([^\}]+)\}/"

正则表达式用于此字符串:

(?P<controller>[a-z-]+)\/{id:\d+}\/(?P<action>[a-z-]+)

preg_match结果:demo

array(
   0=>{id:\d+}
   1=>id
   2=>\d+
)

此代码可以正常工作,但是我的问题是为什么!?

我不知道的部分是[^\\}]。根据正则表达式规则,这应排除[ ]内的字符,但取而代之的是,我得到一个完整的字符串作为从:到右括号}的值,如果我使用{改为{1}}或[^}][^{}]

正则表达式的[^{]部分如何正常工作?

此处完全实现了“添加”功能

[^\\}]

并将基本字符串添加到路由

<?php

class Router {
  protected $routes = [];
  protected $params = [];

  //Add a route to the routing table
  public function add($route, $params = []){
    //convert the route to a regular expresion: escape forward slashes
    $route = preg_replace('/\//','\\/', $route);

    //Convert variables e.g. {controller}
    $route = preg_replace('/\{([a-z-]+)\}/','(?P<\1>[a-z-]+)', $route);

    //Convert variables with custom regular expressions e.g. {id:\d+}
    $route = preg_replace('/\{([a-z-]+):([^\}]+)\}/','(?P<\1>\2)', $route);

    //add start and end delimiters and case sensitive flag
    $route = '/^'.$route.'$/i';

    $this->routes[$route] = $params;
  }
}

1 个答案:

答案 0 :(得分:1)

[^\}]实际上有一个额外的\[^\}][^}]相同。

这意味着不是}的字符。 +表示其前面的一个或多个元素。因此([^\}]+)([^}]+)会积极地匹配一个或多个不是}的字符(意味着尽可能匹配)。因此,在您的示例中,它匹配\d+

-根据评论进行编辑,其中}不需要\进行转义。