【问题标题】:How to add http:// if it doesn't exist in the URL如果 URL 中不存在 http://,如何添加
【发布时间】:2011-02-15 06:21:59
【问题描述】:

如果 URL 尚未包含协议(例如 http://https://ftp://),我如何将 http:// 添加到 URL?

例子:

addhttp("google.com"); // http://google.com
addhttp("www.google.com"); // http://www.google.com
addhttp("google.com"); // http://google.com
addhttp("ftp://google.com"); // ftp://google.com
addhttp("https://google.com"); // https://google.com
addhttp("http://google.com"); // http://google.com
addhttp("rubbish"); // http://rubbish

【问题讨论】:

  • 如果只有mozilla.org,你怎么知道是httphttps还是ftp
  • @Anthony:他说如果没有其他协议,他想添加“http://”。
  • @Anthony 但是当用户键入没有 http:// 或其他任何内容的 url 时,您是否希望它是 ftp:// 或其他内容?

标签: php regex


【解决方案1】:

试试这个。它不是防水的1,但它可能已经足够了:

function addhttp($url) {
    if (!preg_match("@^[hf]tt?ps?://@", $url)) {
        $url = "http://" . $url;
    }
    return $url;
}

1。也就是说,像“fttps://”这样的前缀被视为有效。

【讨论】:

  • 这将匹配(ergo 返回 true 并且 if 将评估为 false)奇怪的组合.. 像 htps、fttps、fttp、htp,我猜。
【解决方案2】:

nickf's solution修改:

function addhttp($url) {
    if (!preg_match("@^https?://@i", $url) && !preg_match("@^ftps?://@i", $url)) {
        $url = "http://" . $url;
    }
    return $url;
}

【讨论】:

  • 我相信ftps://也是有效的。
  • @Alix:不知道这一点。已编辑。
【解决方案3】:

@nickf 代码的修改版本:

function addhttp($url) {
    if (!preg_match("~^(?:f|ht)tps?://~i", $url)) {
        $url = "http://" . $url;
    }
    return $url;
}

以不区分大小写的方式识别ftp://ftps://http://https://

【讨论】:

  • 下面比较了addhttp和addscheme,我得出的结论是addscheme在性能上更好:$url = "www.google.com"; $init = microtime(true); for( $i = 1; $i < 100000; $i++ ) { addScheme( $url ); } echo microtime(true) - $init; echo "<BR>"; $init = microtime(true); for( $i = 1; $i < 100000; $i++ ) { addhttp( $url ); } echo microtime(true) - $init;
  • 如果url以'//'开头怎么办?
【解决方案4】:

扫描字符串中的://。如果没有,请将http:// 添加到字符串...其他所有内容都按原样使用字符串。

除非你有一个垃圾输入字符串,否则这将起作用。

【讨论】:

  • 我更喜欢正则表达式版本:)
  • 不要对正则表达式太快。正则表达式往往难以阅读,一旦问题扩大,它可能会引入另一个问题/错误。
【解决方案5】:

只需检查是否有协议(用“://”表示),如果没有则添加“http://”。

if (false === strpos($url, '://')) {
    $url = 'http://' . $url;
}

注意:这可能是一个简单直接的解决方案,但使用parse_urlJack's answer 几乎同样简单且更加健壮。您可能应该使用那个。

【讨论】:

    【解决方案6】:
    <?php
        if (!preg_match("/^(http|ftp):/", $_POST['url'])) {
            $_POST['url'] = 'http://'.$_POST['url'];
        }
        $url = $_POST['url'];
    ?>
    

    如果 URL 不存在,此代码会将 http:// 添加到 URL。

    【讨论】:

      【解决方案7】:

      在撰写本文时,没有一个答案为此使用了内置函数:

      function addScheme($url, $scheme = 'http://')
      {
        return parse_url($url, PHP_URL_SCHEME) === null ?
          $scheme . $url : $url;
      }
      
      echo addScheme('google.com'); // "http://google.com"
      echo addScheme('https://google.com'); // "https://google.com"
      

      另请参阅:parse_url()

      【讨论】:

      • 这应该是选择的答案 - 当语言有原生支持时为什么要自己动手?干得好。
      • 可以使用此函数进行的一项改进是检查字段是否有值,因此它不会向空字段添加 http。
      • 这不适用于相关协议。例如echo addScheme('//google.com');
      • @Taylan 是的,你必须ltrim($url, '/')
      【解决方案8】:

      对此的最佳答案应该是这样的:

      function addhttp($url, $scheme="http://" )
      {
        return $url = empty(parse_url($url)['scheme']) ? $scheme . ltrim($url, '/') : $url;
      }
      

      协议灵活,ftp、https等都可以使用同样的功能

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-16
        • 2022-01-08
        • 2012-05-25
        • 2014-03-06
        • 2015-10-31
        • 1970-01-01
        • 2012-07-16
        • 1970-01-01
        相关资源
        最近更新 更多