Предварительно добавив "http://" к URL, который еще не содержит" http://" - PullRequest
36 голосов
/ 23 августа 2010

У меня есть поле input, в котором сохраняется URL, я бы хотел, чтобы этот сохраненный ввод распознавался, когда «Http //» отсутствует в начале переменной, но не знаю, с чего начать ... можно проверить только часть строки? - тогда есть функция, которая будет добавляться при необходимости?

Ответы [ 12 ]

93 голосов
/ 23 августа 2010

Если вы также хотите разрешить "https://",, я бы использовал следующее регулярное выражение:

if (!/^https?:\/\//i.test(url)) {
    url = 'http://' + url;
}

Если вы не знакомы с регулярными выражениями, вот что означает каждая часть.

  • ^ - совпадать только в начале строки
  • http - Соответствует литеральной строке "http"
  • s? - при желании соответствовать "s"
  • : - сопоставить двоеточие
  • \/\/ - экранировать символы "/", поскольку они отмечают начало / конец регулярного выражения
  • "i" после регулярного выражения делает его нечувствительным к регистру, поэтому оно будет соответствовать "HTTP://", и т.д.
65 голосов
/ 23 августа 2010

Простое решение для того, что вы хотите, это следующее:

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;
    }
    
  • Использование библиотеки анализа URI, такой как JS-URI .

    if (new URI(s).scheme === null)
    {
        s = 'http://' + s;
    }
    

Смежные вопросы

22 голосов
/ 23 августа 2010

снято с линкенизатора (ноль не будет возражать)

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, не испортили ссылки.

5 голосов
/ 05 декабря 2016

Я изменил ответ @Mark Byers, включив в него также "https://".

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;
}
5 голосов
/ 22 декабря 2015

Вот что я использую для мгновенного удовлетворения.использование прослушивателя keyup в 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());
        }
    });
2 голосов
/ 08 ноября 2018

ES6, один вкладыш

Вот «современный» подход:

const withHttp = url => !/^https?:\/\//i.test(url) ? `http://${url}` : url;

Теперь вы можете использовать withHttp как функцию:

const myUrl = withHttp("www.example.org");
2 голосов
/ 12 июня 2017

Ниже фрагмент кода проверяет:

  • Проверяет, не является ли URL пустым
  • Удаляет пустые пробелы в начале или конце
  • Проверяет http://example.com, https://example.com И // 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
    }
    
2 голосов
/ 23 августа 2010
if (url.indexOf('http://') != 0)
    url = 'http://' + url;
2 голосов
/ 23 августа 2010

Как-то так (запись по памяти)?

if (url.toUpper(url.substring(0, 7) != "HTTP://")
  url = "http://" + url;
0 голосов
/ 17 мая 2017

Я изменил ответы @Morgan Taylor и @Mark Byer's, чтобы они не учитывали регистр.Работает с 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...