如果URL中不存在http://,如何添加?


110

我如何添加http://到URL,如果它不包括协议(例如http://https://ftp://)?

例:

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独自一人,你怎么知道它是否应该,httphttpsftp
Anthony Forloney,2010年

7
@Anthony:他说如果没有其他协议,他想添加“ http://”。
尼克

3
@Anthony但是,当用户键入不带http://或其他任何内容的url时,您是否希望它是ftp://或其他内容?
瑞安(Ryan)2010年

Answers:


265

@nickf代码的修改版本:

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

认识到ftp://ftps://http://https://在不区分大小写的方式。


5
在比较下面的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;
Luis Lobo Borobia

如果url以'//'开头怎么办?
holden321

@ holden321这让我想起一首关于大象的诗,大象游了泳,以鱼的身份回来了,不惜一切代价阻止您从事某些可能伤害您的事情。世界上有那么多人,并且您知道,您有这个不可思议的想法,并且您认为缺少的是动力,但这不是事实。因为我们思维和人类的事实联系在一起的方式是,我们不打算做不舒服的事情。
本垒打

136

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

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()


13
这应该是选择的答案-当语言有本机支持时,为什么要自己动手做?辛苦了
汤姆·奥格

2
可以使用此功能进行的一项改进是检查该字段是否具有值,以便不向空字段添加http。
兰迪·约翰逊

这不适用于相对协议。例如echo addScheme('//google.com');
Taylan '16

2
@Taylan呀,你就必须ltrim($url, '/')
杰克

51

只需检查是否存在协议(用“://”表示),然后添加“ http://”即可。

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

注意:这可能是一个简单明了的解决方案,但是Jack的答案parse_url几乎一样简单且更可靠。您可能应该使用那个。


2

最好的答案是这样的:

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

1

扫描字符串以查找://,如果没有,http://在字符串之前添加..,其他所有内容都按原样使用该字符串。

除非您有垃圾输入字符串,否则它将起作用。


我更喜欢正则表达式版本:)
Ryan 2010年

3
在正则表达式上不要太快。正则表达式往往很难阅读,一旦问题加剧,它可能会引入另一个问题/错误。
Rosdi Kasim 2010年

0

nickf解决方案已修改:

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

相信ftps://也是有效的。
Alix Axel,2010年

@Alix:没意识到。编辑。
kamasheto

0
<?php

if (!preg_match("/^(http|ftp):/", $_POST['url'])) {
   $_POST['url'] = 'http://'.$_POST['url'];
}
$url = $_POST['url'];

?>

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


-1

试试这个。没有水密性*,但可能足够好:

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

*:即像“ fttps://”这样的前缀被视为有效。


6
这会匹配(ergo返回true,如果结果为false)怪异的组合..我想是htps,fttps,fttp,htp。
kamasheto
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.