如何使用 preg_match 从 URL 获取 ID?
How to get an ID from an URL using preg_match?
问题
我目前正在 url 上做 preg_match
。这个url在第二个参数或者第三个参数中有一定的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;
}
然而,这似乎不起作用。
如果以下正则表达式确实如您所愿地工作
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 中进行,因为开头或第二个表达式与第一个表达式相同。即使你把它们转过来,你也总是会从第一个 parameter/path 部分获得 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
问题
我目前正在 url 上做 preg_match
。这个url在第二个参数或者第三个参数中有一定的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;
}
然而,这似乎不起作用。
如果以下正则表达式确实如您所愿地工作
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 中进行,因为开头或第二个表达式与第一个表达式相同。即使你把它们转过来,你也总是会从第一个 parameter/path 部分获得 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