我目前正在关注有关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;
}
}
答案 0 :(得分:1)
[^\}]
实际上有一个额外的\
,[^\}]
与[^}]
相同。
这意味着不是}
的字符。 +
表示其前面的一个或多个元素。因此([^\}]+)
或([^}]+)
会积极地匹配一个或多个不是}
的字符(意味着尽可能匹配)。因此,在您的示例中,它匹配\d+
。
-根据评论进行编辑,其中}
不需要\
进行转义。