Jak dodać http: //, jeśli nie ma go w adresie URL?

110

Jak mogę dodać http://do adresu URL, jeśli nie zawierają już protokół (na przykład http://, https://lub ftp://)?

Przykład:

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
Ryan
źródło
Gdybyś to zrobił mozilla.orgsam, skąd wiedziałbyś, czy tak powinno być http, httpsczy ftp?
Anthony Forloney
7
@Anthony: mówi, że chce dodać „http: //”, jeśli nie ma innego protokołu.
nickf
3
@Anthony Ale kiedy użytkownik wpisze adres URL bez http: // lub czegokolwiek, spodziewasz się, że będzie to ftp: // czy coś takiego?
Ryan

Odpowiedzi:

265

Zmodyfikowana wersja kodu @nickf:

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

Uznaje ftp://, ftps://, http://i https://w ten sposób nie uwzględnia wielkości liter.

Alix Axel
źródło
5
Porównując addhttp i addscheme poniżej, doszedłem do wniosku, że addscheme jest lepszy pod względem wydajności: $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
A jeśli adres URL zaczyna się od „//”?
holden321
@ holden321 Przypomina mi wiersz o słoniu, który pływał i wrócił jako ryba z nastawieniem, by za wszelką cenę powstrzymać cię od robienia rzeczy i rzeczy, które mogą cię zranić. Na świecie jest tak wielu ludzi i wiesz, masz niesamowite pomysły, a myślisz, że brakuje motywacji, ale to nieprawda. ponieważ sposób, w jaki nasze umysły są okablowane i fakty dotyczące ludzi, są takie, że nie jesteśmy stworzeni do robienia rzeczy, które nie są wygodne.
homerun
136

W chwili pisania tego tekstu żadna z odpowiedzi nie korzystała z wbudowanej funkcji:

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"

Zobacz też: parse_url()

Jacek
źródło
13
To powinna być wybrana odpowiedź - po co tworzyć własną, skoro język ma natywne wsparcie? Dobra robota.
Tom Auger
2
Jednym z ulepszeń, które można by wprowadzić za pomocą tej funkcji, jest sprawdzenie, czy pole ma wartość, więc nie dodaje http do pustego pola.
Randy Johnson,
To nie działa w przypadku protokołów względnych. np.echo addScheme('//google.com');
Taylan
2
@Taylan Tak, musiałbyśltrim($url, '/')
Ja͢ck
51

Po prostu sprawdź, czy istnieje protokół (określony przez „: //”) i dodaj „http: //”, jeśli go nie ma.

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

Uwaga : może to być proste i nieskomplikowane rozwiązanie, ale odpowiedź Jacka parse_urljest prawie tak samo prosta i znacznie bardziej niezawodna. Prawdopodobnie powinieneś użyć tego.

Brenton Alker
źródło
2

Najlepszą odpowiedzią na to byłoby coś takiego:

function addhttp($url) 
{
  return $url = empty(parse_url($url)['scheme']) ? 'http://' . ltrim($url, '/') : $url;
}
Ten koleś
źródło
1

Przeszukaj łańcuch w poszukiwaniu ://, jeśli go nie ma, dołącz http://go do ciągu .., wszystko inne po prostu użyj ciągu bez zmian.

To zadziała, chyba że masz niepotrzebny ciąg wejściowy.

Rosdi Kasim
źródło
wolę wersję wyrażenia regularnego :)
Ryan
3
Nie spiesz się z wyrażeniem regularnym. Regex jest zwykle trudny do odczytania i może wprowadzić kolejny problem / błąd, gdy problem się rozwinie.
Rosdi Kasim
0

zmodyfikowany roztwór nickf:

function addhttp($url) {
    if (!preg_match("@^https?://@i", $url) && !preg_match("@^ftps?://@i", $url)) {
        $url = "http://" . $url;
    }
    return $url;
}
kamasheto
źródło
Uważam, że ftps://jest również ważny.
Alix Axel
@Alix: nie był tego świadomy. Edytowano.
kamasheto
0
<?php

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

?>

ten kod doda http: // do adresu URL, jeśli go tam nie ma.

ayan
źródło
-1

Spróbuj tego. Nie jest wodoszczelny *, ale może być wystarczająco dobry:

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

*: to znaczy, przedrostki takie jak „fttps: //” są traktowane jako prawidłowe.

nickf
źródło
6
To pasowałoby (ergo zwróciło prawdę, a jeśli dałoby wartość fałszowi) dziwne kombinacje ... jak htps, fttps, fttp, htp, tak myślę.
kamasheto