Как добавить http: //, если его нет в URL?

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одни, как бы вы узнали, должно ли это быть http, httpsили ftp?
Энтони Форлони
7
@Anthony: он говорит, что хочет добавить http: //, если нет другого протокола.
nickf
3
@Anthony Но когда пользователь вводит URL без http: // или чего-то еще, вы ожидаете, что это будет ftp: // или что-то в этом роде?
Райан

Ответы:

265

Модифицированная версия кода @nickf:

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

Признает ftp://, ftps://, http://и https://в случае нечувствительным образом.

Аликс Аксель
источник
5
Сравнив addhttp и addcheme ниже, я пришел к выводу, что addcheme лучше с точки зрения производительности: $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-адрес начинается с "//"?
holden321
@ holden321 Это напоминает мне стихотворение о слоне, который отправился плавать и вернулся в виде рыбы с мыслями о том, чтобы любой ценой помешать вам делать и делать то, что может вам навредить. В мире так много людей, и вы знаете, у вас есть невероятные идеи, и вам кажется, что не хватает мотивации, но это неправда. потому что наш разум устроен и факты о людях таковы, что мы не созданы для того, чтобы делать то, что неудобно.
homerun
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
Это должен быть выбранный ответ - зачем использовать собственный, если у языка есть встроенная поддержка? Хорошая работа.
Tom Auger
2
Одно из улучшений, которое можно было бы сделать с помощью этой функции, - это проверка того, имеет ли поле значение, чтобы оно не добавляло http к пустому полю.
Рэнди Джонсон
Это не работает с относительными протоколами. напримерecho addScheme('//google.com');
Тайлан
2
@Taylan Да, тебе придетсяltrim($url, '/')
Ja͢ck
51

Просто проверьте, существует ли протокол (обозначенный «: //»), и добавьте «http: //», если его нет.

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

Примечание : это может быть простое и понятное решение, но ответ Джека с использованием parse_urlпочти так же прост и намного надежнее. Вам, вероятно, следует использовать это.

Брентон Алкер
источник
2

Лучшим ответом на это будет что-то вроде этого:

function addhttp($url) 
{
  return $url = empty(parse_url($url)['scheme']) ? 'http://' . ltrim($url, '/') : $url;
}
Этот чувак
источник
1

Просканируйте строку ://, если ее нет, добавьте http://к строке .., все остальное просто используйте строку как есть.

Это будет работать, если у вас нет строки ввода мусора.

Росди Касым
источник
Я предпочитаю версию с регулярным выражением :)
Райан
3
Не спешите с регулярным выражением. Регулярное выражение, как правило, трудно читать, и оно может вызвать другую проблему / ошибку, когда проблема вырастет.
Росди Касим
0

модифицированный раствор nickf:

function addhttp($url) {
    if (!preg_match("@^https?://@i", $url) && !preg_match("@^ftps?://@i", $url)) {
        $url = "http://" . $url;
    }
    return $url;
}
Камашето
источник
Я считаю ftps://также действительным.
Аликс Аксель
@Alix: не знал об этом. Ред.
камашето 04
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: //» считаются действительными.

nickf
источник
6
Это будет соответствовать (ergo return true, а if - false) странным комбинациям ... вроде htps, fttps, fttp, htp, я думаю.
камашето 04