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

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.


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


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.


2

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

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

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.


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;
}

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.


-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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.