任何人都可以帮我解决这个问题。
example $uri = '/username/carlos'; => $routes[] = '/username/@name';
@name转换变量$name捕获字符串"carlos"
$routes[] = '/list/edit/@id:[0-9]{3}';
$routes[] = '/username/@name';
$routes[] = '/archive/*';
$routes[] = '/';
$uri = '/username/carlos';
foreach ( $routes as $pattern )
{
if ( preg_match( '#^' . preg_replace( '#(?:{{)?@('w+'b)(?:}})?#i', '(?P<'1>['w'-'.!~'*''"(),'s]+)',
str_replace( ''*', '(.*)', preg_quote( $pattern, '/' ) ) ) . ''/?$#i', $uri, $matchs ) )
{
//how to make regex for this to work :
echo $name; // carlos =>$uri = '/username/carlos'; or matt => $uri = '/username/matt';
}
}
感谢阅读
你需要做更多的工作来让它工作,主要是将路由转换成正则表达式,然后你可以在给定的URI上使用。我的做法如下
$routes = $params = array();
$routes[] = '/list/edit/@id:[0-9]{3}';
$routes[] = '/username/@name';
$routes[] = '/archive/*';
$routes[] = '/';
$uri = '/username/carlos';
foreach($routes as $pattern) {
// Convert all characters into safe characters
$pattern = preg_quote($pattern, '~');
// Convert * into .*?
$pattern = preg_replace('/(?<!'''')'''''*/', '.*?', $pattern);
#echo '<pre>'.print_r($pattern, true).'</pre>';
// Convert any @name:expression into their expressions for capture
$pattern = preg_replace_callback('%@([a-zA-Z]+)('''':([^/]+))?%', 'regex_callback', $pattern);
$pattern = '~^' . $pattern . '$~';
if(preg_match($pattern, $uri, $matches)) {
$params = $matches;
break;
}
}
echo '<pre>'.print_r($params, true).'</pre>';
function regex_callback($data) {
#echo '<pre>'.print_r($data, true).'</pre>';
$pattern = '[^/]+';
if(!empty($data[3])) {
$pattern = stripslashes($data[3]);
}
return '(?P<' . $data[1] . '>' . $pattern . ')';
}
将*
转换为.*?
,再将@param转换为(?P<param>[^/]+)
,或将:
后的表达式替换为[^/]+
如果找到匹配项,则将匹配项设置为$params
,并退出foreach循环。要查找名称,只需使用
echo $param['name'];