【问题标题】:Break URL into parts and locate the ID (longest part)将 URL 分成几部分并找到 ID(最长的部分)
【发布时间】:2017-06-09 12:08:01
【问题描述】:

我有一个网址:

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

我想从此 URL 中获取 ID。 ID总是是 URL 1ljJpZDiayzMLhIJ-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的索引。
  • parse_url() 和/或explode()
  • 尽量避免使用正则表达式。用/分割URL并在数组中找到最长的字符串->stackoverflow.com/q/3713517
  • @hjpotter92 听起来可行,但我想忽略 ?usp=sharing#helloworld 部分,因为有时它比 ID 长。请随时发布答案。
  • @hungrykoala URL 并不总是以https://docs.google.com/ 开头——这只是一个示例。

标签: php regex


【解决方案1】:

您可以使用函数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
  • 我添加了几行以将查询包含在搜索中。
  • 谢谢!就是这个。
【解决方案2】:
$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

【讨论】:

    【解决方案3】:

    你可以使用这个正则表达式:^.*\/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 分成几部分,无论它的设置如何,然后抓取最长的部分(忽略查询变量)。
    • @GoodbyeWorld 您不能忽略第二个示例中的查询部分,因为 id 是查询的一部分。您需要指定链接类型,并针对不同的 url 类型使用不同的解析器。
    【解决方案4】:

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

    【讨论】:

    • 请详细说明。
    【解决方案5】:

    您可以使用 PHP_URL_QUERY 过滤 parse_url 结果,例如

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

    【讨论】:

      猜你喜欢
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多