URLを保存するinput
フィールドがあります。変数の先頭に "Http //"がない場合にこの保存された入力を認識したいのですが、どこから始めればよいのかわかりません...文字列の一部のみをチェックすることは可能ですか? -その後、必要に応じて追加する機能がありますか?
必要なものに対する簡単な解決策は次のとおりです。
var prefix = 'http://';
if (s.substr(0, prefix.length) !== prefix)
{
s = prefix + s;
}
ただし、注意すべき点がいくつかあります...
ここでのテストでは大文字と小文字が区別されます。これは、文字列が最初にHttp://example.com
である場合、これがhttp://Http://example.com
に変更することを意味します。また、foo://
で始まる文字列を変更しないでください。そうしないと、http://https://example.com
のようなものになってしまいます。
一方、example.com?redirect=http://othersite.com
などの入力を受け取った場合は、おそらくhttp://
を先頭に追加する必要があるため、://
を検索するだけでは一般的な解決策としては十分ではない可能性があります。
代替アプローチ
正規表現を使用する:
if (!s.match(/^[a-zA-Z]+:\/\//))
{
s = 'http://' + s;
}
JS-URI などのURI解析ライブラリを使用します。
if (new URI(s).scheme === null)
{
s = 'http://' + s;
}
関連する質問
「https://」も許可する場合は、次のような正規表現を使用します。
if (!/^https?:\/\//i.test(url)) {
url = 'http://' + url;
}
正規表現に慣れていない場合は、各部分の意味を以下に示します。
^
-文字列の先頭でのみ一致http
-リテラル文字列「http」に一致s?
-オプションで「s」に一致:
-コロンに一致\/\/
-正規表現の開始/終了を示す「/」文字をエスケープしますLinkenizer から解除(Nullは気にしません)
link = (link.indexOf('://') === -1) ? 'http://' + link : link;
プロトコルを示す'http://'
が見つからない場合、://
をlink
の前に追加します。 ://
が文字列の他の場所にある場合、これはうまく機能しませんが、十分です。
例:
http://www.google.com -> http://www.google.com
ftp://google.com -> ftp://google.com
www.google.com -> http://www.google.com
google.com -> http://google.com
このURLを保存すると言ったので、サーバー側でこれを行うことをお勧めします。これにより、jsが無効になっているクライアントがリンクを台無しにしないようにします。
「Marks://」も含めるように@Mark Byersの回答を変更しました。
function formatUrl(url){
var httpString = 'http://'
, httpsString = 'https://'
;
if (url.substr(0, httpString.length) !== httpString && url.substr(0, httpsString.length) !== httpsString)
url = httpString + url;
return url;
}
「最新の」アプローチを次に示します。
const withHttp = url => !/^https?:\/\//i.test(url) ? `http://${url}` : url;
これで、withHttp
を関数として使用できます。
const myUrl = withHttp("www.example.org");
ここに私が即座に満足させるために使用するものがあります。 jqueryでキーアップリスナーを使用します。
$('#url').keyup(function () {
if ( ($(this).val().length >=5) && ($(this).val().substr(0, 5) != 'http:') && ($(this).val().substr(0, 5) != 'https') ) {
$(this).val('http://' + $(this).val());
}
});
以下のコードスニペットは以下をチェックします。
http://example.com (、https: //example.comAND// example.com
if (!!url && !!url.trim()) { //Check if url is not blank
url = url.trim(); //Removes blank spaces from start and end
if (!/^(https?:)?\/\//i.test(url)) { //Checks for if url doesn't match either of: http://example.com, https://example.com AND //example.com
url = 'http://' + url; //Prepend http:// to the URL
}
} else {
//Handle empty url
}
このようなもの(メモリによる書き込み)?
if (url.toUpper(url.substring(0, 7) != "HTTP://")
url = "http://" + url;
if (url.indexOf('http://') != 0)
url = 'http://' + url;
私は個人的にこれを使用していますが、これは部分的にphpドキュメントから取られています
$scheme = parse_url($link, PHP_URL_SCHEME);
if (empty($scheme)) {
$link = 'http://' . ltrim($link, '/');
}
@Morgan Taylorと@Mark Byerの回答を大文字と小文字を区別しないように変更しました。 http://およびhttps://で動作します
function formatUrl(url)
{
var httpString = "http://";
var httpsString = "https://";
if (url.substr(0, httpString.length).toLowerCase() !== httpString && url.substr(0, httpsString.length).toLowerCase() !== httpsString)
url = httpString + url;
return url;
}