$string = '/product/list.html?a=b';
$regex = '#^^/(?P[\w]+)/(?P[\w]+)(?P[^\.]*)\.*(?P[html|xml|json]*)(?P[\?.*]*)$$#';
$count = preg_match($regex, $string, $matches);
当我运行上面的代码时,会引发此警告:
Warning: preg_match(): Compilation failed: unrecognized character after (?P at offset 6 in php shell code on line 1
我看不出问题出在哪里?
答案 0 :(得分:0)
(?P
用于启动named capturing group。语法是:
(?P<name>regexp)
使用此语法时,将在$matches['name']
中找到与正则表达式匹配的字符串部分。
您的正则表达式中缺少<name>
。
答案 1 :(得分:0)
新解决方案;)
这适用于://someurl/index.php/controller/action
if (array_key_exists('PATH_INFO', $_SERVER)) {
$parts = explode('/', trim($_SERVER['PATH_INFO'], ' /'));
@list($controller, $action) = $parts;
$params = array_slice($parts, 2);
$controller = empty($controller) ? 'default' : ucfirst(strtolower($controller));
$action = empty($action) ? 'default' : strtolower($action);
} else {
$params = array();
$controller = 'default';
$action = 'default';
}
这不是更简单吗? (将“默认”更改为您想要的任何内容)
答案 2 :(得分:0)
你的正则表达式看起来有点不对,也许你试图得到这个:
#^/(?P<folder>[\w]+)/(?P<name>[\w]+)\.(?P<ext>html|xml|json)\?(?P<query>.*)$#
结果:
0 -> /product/list.html?a=b
folder -> product
name -> list
ext -> html
query -> a=b