如何使用preg_match从URL获取ID?

时间:2015-03-02 16:32:01

标签: php regex preg-match

问题

我目前正在网址上进行preg_match。此网址在第二个参数或第三个参数中具有特定ID。但是,我不知道如何更有效地获得这一点。

代码

preg_match('~http://www.example.com/some/(.+?)/~is', $url, $id);
if (!isset($id[1])) {
    preg_match('~http://www.example.com/some/thing/(.+?)/~is', $url, $id);
    if (!isset($id[1])) {
        preg_match('~http://www.example.com/some/other/(.+?)/~is', $url, $id);
        if (!isset($id[1])) {
            preg_match('~http://www.example.com/some/thingelse/(.+?)/~is', $url, $id);
            if (!isset($id[1])) {
                return false
            }
        }
    }
}

我想做什么

if (preg_match('~http://www.example.com/some/(.+?)/~is', $url, $id)) {
    $id = $id[1];
} else if (preg_match('~http://www.example.com/some/(.+?)/(.+?)/~is', $url, $id)) {
    $id = $id[1];
} else {
    return false;
}

但是,这似乎不起作用。

1 个答案:

答案 0 :(得分:2)

如果以下正则表达式确实按照您的要求工作

if (preg_match('~http://www.example.com/some/(.+?)/~is', $url, $id)) {
    $id = $id[1];
} else if (preg_match('~http://www.example.com/some/(.+?)/(.+?)/~is', $url, $id)) {
    $id = $id[1];
} else {
    return false;
}

...无论如何你永远不会达到第二个案子。匹配将在第一个RegEx中进行,因为开头或第二个表达式与第一个表达式相同。即使你转过它们,你总是从第一个参数/路径部分得到id,因为你在两个结果上都设置了$id = $id[1]

正如评论中所述,您可能最好使用parse_url代替:

$urls = [
    'http://www.example.com/some/thingelse/foo/bar/baz/',
    'http://www.example.com/some/foo/bar/baz/',
];

foreach ($urls as $url) {
    echo "Checking $url", PHP_EOL;

    $path = parse_url($url, PHP_URL_PATH);
    $parts = explode('/', $path);

    echo "Second parameter: ", $parts[2], PHP_EOL;
    echo "Third parameter:  ", $parts[3], PHP_EOL;
}

输出:

Checking http://www.example.com/some/thingelse/foo/bar/baz/
Second parameter: thingelse
Third parameter:  foo

Checking http://www.example.com/some/foo/bar/baz/
Second parameter: foo
Third parameter:  bar