2010-05-04 9 views
93

Come posso aggiungere http:// a un URL se non include già un protocollo (ad esempio http://, https:// o ftp://)?Come aggiungere http: // se non esiste nell'URL?

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 
+0

Se trovassi, ' mozilla.org' da solo, come sapresti se dovrebbe essere, 'http',' https' o 'ftp'? –

+6

@Anthony: dice di voler 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

risposta

228

Una versione modificata di @nickf codice:

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

riconosce ftp://, ftps://, http:// e https:// in modo insensibile caso.

+0

Grazie Alix, la versione migliore e funzionante è tua :) – Ryan

+1

@David: Nessun problema, prego. –

+4

Dopo aver confrontato addhttp e addscheme di seguito, sono giunto alla conclusione che addicted è migliore in termini di prestazioni: '$ url =" www.google.com "; $ init = microtime (true); per ($ i = 1; $ i <100000; $ i ++) { \t addScheme ($ url); } echo microtime (true) - $ init; echo "
"; $ init = microtime (true); per ($ i = 1; $ i <100000; $ i ++) { \t addhttp ($ url); } echo microtime (true) - $ init; ' –

-1

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

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

*: vale a dire, i prefissi come "fttps: //" devono essere considerati validi. soluzione

+5

Questo corrisponderebbe (ergo return true e se valutasse a false) strane combinazioni ..come htps, fttps, fttp, htp, credo. – kamasheto

+0

Il mio consiglio a chiunque stia leggendo questo ... probabilmente non lo uso. –

0

nickf modificata:

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

Credo che 'ftps: //' sia anche valido. –

+0

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

2

Eseguire la scansione della stringa per ://, se non ce l'ha, anteporre http:// alla stringa .., tutto il resto utilizza solo la stringa così com'è.

Ciò funzionerà a meno che non si disponga di una stringa di input.

+0

Preferisco una versione regex :) – Ryan

+3

Non essere troppo veloce in regex. Regex tende ad essere difficile da leggere e potrebbe introdurre un altro problema/bug una volta che il problema si è sviluppato. –

48

Controllare semplicemente se esiste un protocollo (delimitato da ": //") e aggiungere "http: //" se non è presente.

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

Nota: Questo può essere una soluzione semplice e lineare, ma la risposta di Jack usando parse_url è quasi più semplice e molto più robusto. Probabilmente dovresti usarlo.

+5

+1 per essere la soluzione più leggibile di tutti. L'intento del programmatore è presto compreso a colpo d'occhio. –

+2

che ne dici di questi collegamenti: magnete:? Fh = sdfs ... – holden321

+0

+1 per la soluzione più semplice –

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 è lì.

101

Al momento della scrittura, nessuna delle risposte utilizzato una funzione built-in 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" 

Vedi anche: parse_url()

+9

Questa dovrebbe essere la risposta selezionata - perché eseguire il rollover quando la lingua ha il supporto nativo? Bel lavoro. –

+1

Un miglioramento che potrebbe essere fatto con questa funzione è il controllo per vedere se il campo ha un valore, quindi non sta aggiungendo un http a un campo vuoto. –

+0

Questo non funziona con i protocolli relativi. per esempio. 'echo addScheme ('// google.com');' – Taylan

-4

utilizzare il prep_url ($ url);

$url = prep_url($url); 

se di controllo se l'http è esistere nulla accada altrimenti aggiungere il http: //

+1

Questa è una funzione helper con codeigniter. Cosa succede se non stai usando quella struttura? –

1

la risposta migliore per questo sarebbe qualcosa di simile:

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