Wie füge ich http: // hinzu, wenn es in der URL nicht vorhanden ist?

110

Wie kann ich http://zu einer URL , wenn es nicht bereits ein Protokoll enthalten (zB http://, https://oder ftp://)?

Beispiel:

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
quelle
Wenn Sie mozilla.orgalleine wären, wie würden Sie wissen, ob es sein sollte http, httpsoder ftp?
Anthony Forloney
7
@Anthony: Er sagt, er möchte "http: //" hinzufügen, wenn es kein anderes Protokoll gibt.
Nickf
3
@Anthony Aber wenn der Benutzer die URL ohne http: // oder irgendetwas eingibt, erwarten Sie, dass es ftp: // oder so ist?
Ryan

Antworten:

265

Eine modifizierte Version von @nickf Code:

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

Erkennt ftp://, ftps://, http://und https://in einem Fall unempfindlich Art und Weise.

Alix Axel
quelle
5
Nachdem ich Addhttp und Addscheme unten verglichen habe, bin ich zu dem Schluss gekommen, dass Addscheme in Bezug auf die Leistung besser ist: $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
Was ist, wenn die URL mit '//' beginnt?
holden321
@ holden321 Es erinnert mich an das Gedicht über den Elefanten, der schwimmen ging und als Fisch zurückkam, mit der Einstellung, dich um jeden Preis davon abzuhalten, Dinge zu tun, die dich verletzen könnten. Es gibt so viele Menschen auf der Welt, und Sie wissen, Sie haben diese unglaublichen Ideen und was Ihrer Meinung nach fehlt, ist Motivation, aber das ist nicht wahr. denn die Art und Weise, wie unser Geist und die Fakten über Menschen verdrahtet sind, ist, dass wir nicht dazu bestimmt sind, Dinge zu tun, die nicht bequem sind.
Homerun
136

Zum Zeitpunkt des Schreibens verwendete keine der Antworten eine integrierte Funktion dafür:

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"

Siehe auch: parse_url()

Jack
quelle
13
Dies sollte die ausgewählte Antwort sein - warum sollten Sie Ihre eigene Antwort erstellen, wenn die Sprache native Unterstützung bietet? Gute Arbeit.
Tom Auger
2
Eine Verbesserung, die mit dieser Funktion erzielt werden könnte, besteht darin, zu überprüfen, ob das Feld einen Wert hat, damit einem leeren Feld kein http hinzugefügt wird.
Randy Johnson
Dies funktioniert nicht mit relativen Protokollen. zBecho addScheme('//google.com');
Taylan
2
@ Taylor Ja, Sie müsstenltrim($url, '/')
Ja --ck
51

Überprüfen Sie einfach, ob es ein Protokoll gibt (abgegrenzt durch ": //"), und fügen Sie "http: //" hinzu, falls dies nicht der Fall ist.

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

Hinweis : Dies mag eine einfache und unkomplizierte Lösung sein, aber Jacks Antwort parse_urlist fast genauso einfach und viel robuster. Sie sollten diesen wahrscheinlich verwenden.

Brenton Alker
quelle
2

Die beste Antwort dafür wäre ungefähr so:

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

Scannen Sie die Zeichenfolge nach ://, wenn sie nicht vorhanden ist, und stellen Sie http://sie der Zeichenfolge voran . Bei allen anderen Zeichenfolgen wird die Zeichenfolge einfach so verwendet, wie sie ist.

Dies funktioniert nur, wenn Sie eine Müll-Eingabezeichenfolge haben.

Rosdi Kasim
quelle
Ich würde eine Regex-Version bevorzugen :)
Ryan
3
Sei nicht zu schnell bei Regex. Regex ist in der Regel schwer zu lesen und kann zu einem weiteren Problem / Fehler führen, sobald das Problem zunimmt.
Rosdi Kasim
0

Nickf-Lösung modifiziert:

function addhttp($url) {
    if (!preg_match("@^https?://@i", $url) && !preg_match("@^ftps?://@i", $url)) {
        $url = "http://" . $url;
    }
    return $url;
}
Kamasheto
quelle
Ich glaube ftps://auch gültig.
Alix Axel
@Alix: war mir dessen nicht bewusst. Bearbeitet.
Kamasheto
0
<?php

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

?>

Dieser Code fügt der URL http: // hinzu, wenn sie nicht vorhanden ist.

ayan
quelle
-1

Versuche dies. Nicht wasserdicht *, aber vielleicht gut genug:

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

*Präfixe wie "fttps: //" werden als gültig behandelt.

nickf
quelle
6
Dies würde mit seltsamen Kombinationen übereinstimmen (ergo return true und wenn dies als false ausgewertet würde). Wie htps, fttps, fttp, htp, denke ich.
Kamasheto