php中的正则表达式,编译失败

时间:2014-03-20 11:31:39

标签: php regex

$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

我看不出问题出在哪里?

3 个答案:

答案 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>.*)$#

Example

结果:

0 -> /product/list.html?a=b
folder -> product
name -> list
ext -> html
query -> a=b