Як додати 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;
Луїс Лобо Borobia

Що робити, якщо 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
Це має бути обрана відповідь - навіщо робити свою власну, коли мова має рідну підтримку? Хороша робота.
Том Ожер

2
Одне поліпшення, яке може бути досягнуто за допомогою цієї функції, - це перевірити, чи має поле значення, тож це не додавання http до порожнього поля.
Ренді Джонсон

Це не працює з відносними протоколами. наприкладecho addScheme('//google.com');
Taylan

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
Не будьте занадто швидкими в регексе. Regex, як правило, важко читати, і це може ввести ще одну проблему / помилку, коли проблема наростає.
Росді Касім

0

Нікфф змінено:

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

Я вважаю, що ftps://це також справедливо.
Алікс Аксель

@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 відповідає істинним), і якщо ви оцінюватимете хибні) дивні комбінації .. як-от htps, fttps, fttp, htp, я думаю.
камашето
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.