http://がURLに存在しない場合に追加する方法は?


110

どのように私は追加することができhttp://、それはすでにプロトコル(例えば含まれていない場合は、URLにhttp://https://またはをftp://)?

例:

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

あなたが持っていた場合は、mozilla.org一人で、どのようにそれがあるべき場合には、知っているだろうhttphttpsまたはftp
Anthony Forloney

7
@Anthony:他にプロトコルがない場合は「http://」を追加したいと彼は言っています。
nickf

3
@Anthonyしかし、ユーザーがhttp://などなしでURLを入力した場合、ftp://などになると思いますか?
ライアン

回答:


265

@nickfコードの修正バージョン:

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

認識しftp://ftps://http://およびhttps://大文字・小文字を区別しない方法で。


5
:の下にaddhttpとaddschemeを比較したので、私はaddschemeは、パフォーマンスの面で優れているという結論に来ている $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;
ルイス・ロボBorobia

URLが「//」で始まる場合はどうなりますか?
holden321

@ holden321それは泳いで行って、あなたを傷つけるかもしれないことやあらゆることであなたをあらゆる犠牲を払うのをやめようという心構えで魚として戻ってきた象についての詩を思い出させます。世界には非常に多くの人々がいます。あなたはこの素晴らしいアイデアを持っています。あなたが見逃していると思うのは動機ですが、それは本当ではありません。私たちの心が結ばれている方法と人間についての事実は、私たちは快適ではないことをするように設計されていないということです。
ホームラン

136

これを書いている時点では、このための組み込み関数を使用する回答はありません。

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"

以下も参照してください。 parse_url()


13
これが選択された答えであるはずです-言語がネイティブサポートしているのに、なぜ自分でロールするのですか?よくやった。
トムオージェ2013

2
この関数でできる改善の1つは、フィールドに値があるかどうかを確認して、空のフィールドにhttpを追加しないことです。
ランディジョンソン、

これは相対プロトコルでは機能しません。例えばecho addScheme('//google.com');
Taylan

2
うん@Taylan、あなたがしなければならないltrim($url, '/')
ジャック

51

プロトコルが存在するかどうかを確認し(「://」で示されます)、存在しない場合は「http://」を追加します。

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

:これはシンプルで簡単な解決策かもしれませんが、ジャックの答えparse_urlはほとんど同じくらい簡単で、はるかに堅牢です。あなたはおそらくそれを使うべきです。


2

これに対する最良の答えは次のようなものです:

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

1

文字列をスキャンして://、ない場合はhttp://、文字列の先頭に追加します。それ以外の場合は、文字列をそのまま使用します。

これは、ごみの入力文字列がない限り機能します。


私は正規表現バージョンを好む:)
Ryan

3
正規表現を急いではいけません。正規表現は読みにくい傾向があり、問題が大きくなると、別の問題やバグが発生する可能性があります。
Rosdi Kasim、

0

nickfソリューションの変更:

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

ftps://も有効だと思います。
Alix Axel

@アリックス:それを知らなかった。編集。
kamasheto

0
<?php

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

?>

このコードは、URLがない場合にhttp://をURLに追加します。


-1

これを試して。水密*ではありませんが、十分かもしれません:

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

*:つまり、「fttps://」のような接頭辞は有効として扱われます。


6
これは一致します(ergoはtrueを返し、評価がfalseの場合)奇妙な組み合わせです。htps、fttps、fttp、htpなどのようです。
かましと
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.