将URL拆分为部分并定位ID(最长的部分)

4

我有一个URL:

$url = 'https://docs.google.com/spreadsheets/d/1ljJpZDiayzMLhIJ-JDSIJjdjdY_xg3RrUDljFVRB0Qk/edit?usp=sharing#helloworld';

我希望能够从此URL中获取ID。ID是URL1ljJpZDiayzMLhIJ-JDSIJjdjdY_xg3RrUDljFVRB0Qk始终不变的最长部分,因此我的方法是针对最长部分进行定位。

我该如何将此URL拆分为多个部分并获取最长部分?在使用拆分功能时,我需要忽略查询变量部分?usp=sharing#helloworld

我已经尝试过的方法

我尝试了一个preg_match_all()方法,并使用了似乎无法正确拆分URL的正则表达式:

$regex = '/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/';
$url = 'https://docs.google.com/spreadsheets/d/1ljJpZDiayzMLhIJ-JDSIJjdjdY_xg3RrUDljFVRB0Qk/edit?usp=sharing#helloworld';
$result = preg_match_all($regex, $url, $matches);
print($matches);

使用 str_replace 函数删除 https://docs.google.com/,然后通过 "/" 将字符串分割,并找到存储您的 ID 的索引。 - hungrykoala
2
parse_url() 和/或 explode() - jeroen
尽可能避免使用正则表达式。使用“/”拆分URL并在数组中查找最长的字符串 -> https://dev59.com/z3A65IYBdhLWcg3wogKe - hjpotter92
@hjpotter92 听起来可行,但我想忽略 ?usp=sharing#helloworld 部分,因为有时它比 ID 更长。请随意发布答案。 - Goodbye World
@hungrykoala URL并不总是以“https://docs.google.com/”开头--这只是一个例子。 - Goodbye World
@jeroen 请随意发布答案。请注意,https://docs.google.com/ 有时可能会不同,并且在检查最长部分时需要删除查询变量 ?usp=sharing#helloworld - Goodbye World
5个回答

8
您可以使用函数explode将字符串拆分为数组。
使用函数parse_url()可以获取您的URL路径。
$path = parse_url($url, PHP_URL_PATH);
$array = explode("/", $path);

编辑

如果您想包含查询变量,可以添加以下三行代码。

parse_str($query,$queries);
$query = parse_url($url, PHP_URL_QUERY);
$array = array_merge($array, $queries);

现在您可以查看哪一部分最长。
$id = "";
foreach($array as $part){
    if(strlen($id) < strlen($part)) {
        $id = $part;
    }
}

这很棒,但似乎无法处理此类型的URL:https://drive.google.com/open?id=1ljJpZDiayzMLhTZcywUGyVkC2Y_xg3RrUDljFVRB0Qggk - Goodbye World
我已经添加了几行代码来包含搜索查询。 - Y4roc
谢谢!这就是它。 - Goodbye World

1
$url = 'https://docs.google.com/spreadsheets/d/1ljJpZDiayzMLhIJ-JDSIJjdjdY_xg3RrUDljFVRB0Qk/edit?usp=sharing#helloworld';
$partURL=explode('/', $url);
$lengths = array_map('strlen', $partURL);
$maxLength = max($lengths);
$index = array_search($maxLength, $lengths);
echo $partURL[$index];
返回值: 1ljJpZDiayzMLhIJ-JDSIJjdjdY_xg3RrUDljFVRB0Qk

0

你可以使用 PHP_URL_QUERY 过滤 parse_url 的结果,例如:

$query = parse_url(<url string>, PHP_URL_QUERY);
parse_str($parts, $queryArray);
$queryArray[<KEY>]

0
您可以使用此正则表达式:^.*\/d\/(.*)\/.*$。 例如:
$regex = '/^.*\/d\/(.*)\/.*$/';
$url = 'https://docs.google.com/spreadsheets/d/1ljJpZDiayzMLhIJ-JDSIJjdjdY_xg3RrUDljFVRB0Qk/edit?usp=sharing#helloworld';
$result = preg_match_all($regex, $url, $matches);
print_r($matches);

你将会得到以下结果:

Array
(
    [0] => Array
        (
            [0] => https://docs.google.com/spreadsheets/d/1ljJpZDiayzMLhIJ-JDSIJjdjdY_xg3RrUDljFVRB0Qk/edit?usp=sharing#helloworld
        )

    [1] => Array
        (
            [0] => 1ljJpZDiayzMLhIJ-JDSIJjdjdY_xg3RrUDljFVRB0Qk
        )

)

这并不适用于所有的URL。例如 https://drive.google.com/open?id=1ljJpZDiayzMLhTZcywUGyVkC2Y_xg3RrUDljFVRB0Qkss2 因此,我需要将URL分成几个部分,无论其设置如何,然后获取最长的部分(忽略查询变量)。 - Goodbye World
@GoodbyeWorld 在第二个例子中,你不能忽略查询部分,因为id是查询的一部分。你需要指定链接类型并针对不同的URL类型使用不同的解析器。 - kRicha

0

你可以使用 substr(string,start,length) 函数。


请详细说明。 - Goodbye World

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接