Come aggiungere http: // se non esiste nell'URL?


110

Come posso aggiungere http://un URL se non include già un protocollo (ad es http://. https://O ftp://)?

Esempio:

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

Se lo avessi fatto mozilla.orgda solo, come sapresti se dovrebbe essere http, httpso ftp?
Anthony Forloney

7
@ Anthony: dice che vuole aggiungere "http: //" se non c'è altro protocollo.
nickf

3
@Anthony Ma quando l'utente digita l'URL senza http: // o altro, ti aspetti che sia ftp: // o qualcosa del genere?
Ryan

Risposte:


265

Una versione modificata del codice @nickf:

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

Riconosce ftp://, ftps://, http://e https://in un modo case insensitive.


5
Dopo aver confrontato addhttp e addScheme di seguito, sono giunto alla conclusione che AddScheme è migliore in termini di prestazioni: $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

E se l'URL inizia con "//"?
holden321

@ holden321 Mi ricorda la poesia sull'Elefante che è andato a nuotare ed è tornato come un pesce con la mentalità di impedirti a tutti i costi di fare e cose che potrebbero ferirti. Ci sono così tante persone nel mondo, e sai, hai queste idee incredibili e quello che pensi manchi è la motivazione, ma non è vero. perché il modo in cui le nostre menti sono cablate e i fatti sugli esseri umani è che non siamo progettati per fare cose che non sono comode.
homerun

136

Al momento della scrittura, nessuna delle risposte utilizzava una funzione incorporata per questo:

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"

Guarda anche: parse_url()


13
Questa dovrebbe essere la risposta selezionata: perché lanciarne una tua quando la lingua ha il supporto nativo? Bel lavoro.
Tom Auger

2
Un miglioramento che potrebbe essere fatto con questa funzione è controllare se il campo ha un valore in modo da non aggiungere un http a un campo vuoto.
Randy Johnson,

Questo non funziona con i protocolli relativi. ad esempioecho addScheme('//google.com');
Taylan

2
@Taylan Sì, dovrestiltrim($url, '/')
Ja͢ck

51

Controlla semplicemente se esiste un protocollo (delineato da ": //") e aggiungi "http: //" se non c'è.

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

Nota : questa può essere una soluzione semplice e diretta, ma la risposta di Jack che usa parse_urlè quasi altrettanto semplice e molto più robusta. Probabilmente dovresti usare quello.


2

La risposta migliore per questo sarebbe qualcosa del genere:

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

1

Scansiona la stringa per ://, se non ce l'ha, anteponi http://alla stringa .., tutto il resto usa la stringa così com'è.

Funzionerà a meno che tu non abbia una stringa di input spazzatura.


Preferisco una versione regex :)
Ryan

3
Non essere troppo veloce con le espressioni regolari. L'espressione regolare tende ad essere difficile da leggere e potrebbe introdurre un altro problema / bug una volta che il problema cresce.
Rosdi Kasim

0

soluzione nickf modificata:

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

Credo ftps://sia anche valido.
Alix Axel

@Alix: non ne era a conoscenza. Modificato.
kamasheto

0
<?php

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

?>

questo codice aggiungerà http: // all'URL se non è presente.


-1

Prova questo. Non a tenuta stagna *, ma potrebbe essere abbastanza buono:

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

*: ovvero, prefissi come "fttps: //" vengono considerati validi.


6
Questo corrisponderebbe (ergo restituirebbe vero e se restituirebbe falso) combinazioni strane .. come htps, fttps, fttp, htp, immagino.
kamasheto
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.