使用 Javascript 检查字符串是否以 http 开头

Check if a string starts with http using Javascript

本文关键字:http 开头 是否 字符串 Javascript 检查 使用      更新时间:2023-09-26

我一直在寻找这个问题的答案,我找到的所有答案都没有在JavaScript中。

我需要一种方法,在javascript中,检查字符串是否以http,https或ftp开头。如果它不是以其中一个开头,我需要在字符串前面加上 http:// .indexOf 对我不起作用,我认为我不需要 http、https 或 ftp。此外,我不希望像 google.com/?q=http://google.com 这样的东西触发它是有效的,因为它不以 http 开头,而 indexOf 会触发它是真的(如果我没有完全弄错的话)。

我找到的最接近的PHP正则表达式是这样的:

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

来源:如果 url 中不存在,如何添加 http

我只是不知道如何将其转换为javascript。任何帮助将不胜感激。

export const getValidUrl = (url = "") => {
    let newUrl = window.decodeURIComponent(url);
    newUrl = newUrl.trim().replace(/'s/g, "");
    if(/^(:'/'/)/.test(newUrl)){
        return `http${newUrl}`;
    }
    if(!/^(f|ht)tps?:'/'//i.test(newUrl)){
        return `http://${newUrl}`;
    }
    return newUrl;
};

测试:

expect(getValidUrl('https://www.test.com')).toBe('https://www.test.com');
expect(getValidUrl('http://www.test.com')).toBe('http://www.test.com');
expect(getValidUrl('    http   :    /  /  www.test.com')).toBe('http://www.test.com');
expect(getValidUrl('ftp://www.test.com')).toBe('ftp://www.test.com');
expect(getValidUrl('www.test.com')).toBe('http://www.test.com');
expect(getValidUrl('://www.test.com')).toBe('http://www.test.com');
expect(getValidUrl('http%3A%2F%2Fwww.test.com')).toBe('http://www.test.com');
expect(getValidUrl('www    .  test.com')).toBe('http://www.test.com');

这应该有效:

var pattern = /^((http|https|ftp):'/'/)/;
if(!pattern.test(url)) {
    url = "http://" + url;
}

js小提琴

var url = "http://something.com"
if( url.indexOf("http") == 0 ) {
    alert("yeah!");
} else {
    alert("No no no!");
}

非正则表达式声明方式:

const hasValidUrlProtocol = (url = '') => 
    ['http://', 'https://', 'ftp://'].some(protocol => url.startsWith(protocol))

这应该有效:

var re = /^(http|https|ftp)/
进一步

完善了以前的答案,我使用new RegExp(...)来避免混乱的转义,并且还添加了一个可选的s

var pattern = new RegExp('^(https?|ftp)://');
if(!pattern.test(url)) {
    url = "http://" + url;
}

var pattern = new RegExp('^(https?|ftp)://');
console.log(pattern.test('http://foo'));
console.log(pattern.test('https://foo'));
console.log(pattern.test('ftp://foo'));
console.log(pattern.test('bar'));

我想说的最佳可读性是使用.startsWith('theString')

下面的代码检查http://https://ftp://,如果它们中的任何一个符合,则okUrl设置为布尔值 true,方法是使用 || 表示 or

当您知道 url 是否不包含这些字符串时,只需将 http:// 添加到字符串的开头,或者使用文字 ( ${}

let url = 'google.com'
const urlOK = url.startsWith('http://') || url.startsWith('https://') || url.startsWith('ftp://')

if (!urlOk) url = `http://${url}`
// => 'http://google.com'

或者使用简单的字符串concat,可以通过多种方式完成,例如:

url = 'http://' + url

在此处阅读更多相关信息并进行测试:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith