URL'de yoksa http: // nasıl eklenir?


110

http://Zaten bir protokol içermiyorsa (örneğin http://, https://veya ftp://) bir URL'ye nasıl ekleyebilirim ?

Misal:

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

Eğer olsaydı, mozilla.orgtek başına, hani nasıl olması gerektiği takdirde, olur http, httpsyoksa ftp?
Anthony Forloney

7
@Anthony: Başka bir protokol yoksa "http: //" eklemek istediğini söylüyor.
nickf

3
@Anthony Ancak kullanıcı url'yi http: // veya başka bir şey olmadan yazdığında, bunun ftp: // veya başka bir şey olmasını bekler misiniz?
Ryan

Yanıtlar:


265

@Nickf kodunun değiştirilmiş bir sürümü:

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

Tanır ftp://, ftps://, http://ve https://büyüklük duyarsız bir şekilde.


5
Aşağıdaki addhttp ve addscheme'yi karşılaştırdıktan sonra, addscheme'nin performans açısından daha iyi olduğu sonucuna vardım: $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

Ya url '//' ile başlıyorsa?
holden321

@ holden321 Sizi her ne pahasına olursa olsun yapmaktan ve sizi incitebilecek şeyleri durdurmak için yüzmeye giden ve bir balık olarak geri dönen Fil hakkındaki şiiri hatırlatıyor. Dünyada çok fazla insan var ve biliyorsunuz, bu inanılmaz fikirlere sahipsiniz ve eksik olduğunu düşündüğünüz şey motivasyon, Ama bu doğru değil. çünkü zihinlerimizin birbirine bağlanma şekli ve insanlarla ilgili gerçekler, rahat olmayan şeyleri yapmak için tasarlanmamamızdır.
homerun

136

Yazma sırasında, cevapların hiçbiri bunun için yerleşik bir işlev kullanmadı:

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"

Ayrıca bakınız: parse_url()


13
Seçilen cevap bu olmalıdır - dilde yerel destek varken neden kendi cevabınızı kendiniz atasınız? İyi iş.
Tom Auger

2
Bu işlevle yapılabilecek bir iyileştirme, alanın bir değere sahip olup olmadığını kontrol etmektir, böylece boş bir alana bir http eklemeyecektir.
Randy Johnson

Bu, göreceli protokollerle çalışmaz. örneğinecho addScheme('//google.com');
Taylan

2
@Taylan Evet, yapmalısınltrim($url, '/')
Ja͢ck

51

Bir protokol olup olmadığını kontrol edin (": //" ile tanımlanan) ve yoksa "http: //" ekleyin.

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

Not : Bu basit ve anlaşılır bir çözüm olabilir, ancak Jack'in cevabı parse_urlneredeyse aynı derecede basit ve çok daha sağlamdır. Muhtemelen onu kullanmalısın.


2

Bunun için En İyi Cevap şunun gibi bir şey olacaktır:

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

1

Diziyi tara ://, eğer yoksa , dizenin başına ekle http://.., diğer her şey dizeyi olduğu gibi kullanır.

Bu, çöp girdi dizesi olmadıkça işe yarayacaktır.


i'de normal ifade sürümünü tercih ederim :)
Ryan

3
Normal ifadede çok hızlı olmayın. Normal ifadenin okunması zor olma eğilimindedir ve sorun büyüdüğünde başka bir sorun / hataya neden olabilir.
Rosdi Kasim

0

nickf çözümü değiştirildi:

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

Ben ftps://de geçerli olduğuna inanıyorum .
Alix Axel

@Alix: bunun farkında değildim. Düzenlenen.
kamasheto

0
<?php

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

?>

bu kod, orada değilse URL'ye http: // ekler.


-1

Bunu dene. Su geçirmez değil *, ancak yeterince iyi olabilir:

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

*: yani, "fttps: //" gibi önekler geçerli kabul edilir.


6
Bu eşleşir (ergo true ve eğer false olarak değerlendirilirse) garip kombinasyonlar .. htps, fttps, fttp, htp gibi sanırım.
kamasheto
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.