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

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.


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


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.


2

Jawaban Terbaik untuk ini adalah seperti ini:

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

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.


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

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.


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


6
Ini akan cocok dengan (ergo return true dan jika akan mengevaluasi ke false) kombinasi aneh .. seperti htps, fttps, fttp, htp, kurasa.
kamasheto
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.