Bagaimana cara menambahkan http: // jika tidak ada di URL?

110

Bagaimana saya bisa menambahkan http://ke URL jika belum menyertakan protokol (misalnya http://, https://atau ftp://)?

Contoh:

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
sumber
Jika Anda pernah, mozilla.orgsendirian, bagaimana Anda tahu apakah itu harus http, httpsatau ftp?
Anthony Forloney
7
@Anthony: dia bilang dia ingin menambahkan "http: //" jika tidak ada protokol lain.
nickf
3
@Anthony Tetapi ketika pengguna mengetik url tanpa http: // atau apa pun, apakah Anda mengharapkannya menjadi ftp: // atau sesuatu?
Ryan

Jawaban:

265

Versi kode @nickf yang dimodifikasi:

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

Mengakui ftp://, ftps://, http://dan https://dengan cara kasus tidak sensitif.

Alix Axel
sumber
5
Setelah membandingkan addhttp dan addscheme di bawah ini, saya sampai pada kesimpulan bahwa addscheme lebih baik dalam hal kinerja: $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
Bagaimana jika url dimulai dengan '//'?
holden321
@ holden321 Itu mengingatkan saya pada puisi tentang Gajah yang pergi berenang dan kembali sebagai ikan dengan pola pikir untuk menghentikan Anda dengan segala cara dan hal-hal yang mungkin menyakiti Anda. Ada begitu banyak orang di dunia ini, dan Anda tahu, Anda memiliki ide-ide luar biasa dan apa yang menurut Anda hilang adalah motivasi. Tapi itu tidak benar. karena cara pikiran kita terhubung dan fakta tentang manusia adalah bahwa kita tidak dirancang untuk melakukan hal-hal yang tidak nyaman.
homerun
136

Pada saat penulisan, tidak ada jawaban yang menggunakan fungsi bawaan untuk ini:

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"

Lihat juga: parse_url()

Mendongkrak
sumber
13
Ini harus menjadi jawaban yang dipilih - mengapa menggulung jawaban Anda sendiri ketika bahasa memiliki dukungan asli? Kerja bagus.
Tom Auger
2
Satu perbaikan yang dapat dilakukan dengan fungsi ini adalah memeriksa untuk melihat apakah bidang memiliki nilai sehingga tidak menambahkan http ke bidang kosong.
Randy Johnson
Ini tidak bekerja dengan protokol relatif. misalnyaecho addScheme('//google.com');
Taylan
2
@Taylan Ya, Anda harusltrim($url, '/')
Ja͢ck
51

Cukup periksa apakah ada protokol (digambarkan oleh ": //") dan tambahkan "http: //" jika tidak ada.

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

Catatan : Ini mungkin solusi yang sederhana dan lugas, tetapi jawaban Jack yang digunakan parse_urlhampir sesederhana dan jauh lebih kuat. Anda mungkin harus menggunakan yang itu.

Brenton Alker
sumber
2

Jawaban Terbaik untuk ini adalah seperti ini:

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

Pindai string untuk ://, jika tidak memilikinya, tambahkan http://ke string .., yang lainnya cukup gunakan string apa adanya.

Ini akan bekerja kecuali Anda memiliki string masukan sampah.

Rosdi Kasim
sumber
Saya lebih suka versi regex :)
Ryan
3
Jangan terlalu cepat menggunakan regex. Regex cenderung sulit dibaca dan dapat menimbulkan masalah / bug lain setelah masalah berkembang.
Rosdi Kasim
0

solusi nickf dimodifikasi:

function addhttp($url) {
    if (!preg_match("@^https?://@i", $url) && !preg_match("@^ftps?://@i", $url)) {
        $url = "http://" . $url;
    }
    return $url;
}
kamasheto
sumber
Saya yakin ftps://juga valid.
Alix Axel
@ Alix: tidak menyadarinya. Diedit.
kamasheto
0
<?php

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

?>

kode ini akan menambahkan http: // ke URL jika tidak ada.

ayan
sumber
-1

Coba ini. Tidak kedap air *, tapi mungkin cukup baik:

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

*: artinya, prefiks seperti "fttps: //" dianggap valid.

nickf
sumber
6
Ini akan cocok dengan (ergo return true dan jika akan mengevaluasi ke false) kombinasi aneh .. seperti htps, fttps, fttp, htp, kurasa.
kamasheto