我有一个input
保存 URL的字段,我希望这个保存的输入能够识别变量开头不存在“Http//”但不知道从哪里开始......是否可以只检查一部分一个字符串?- 然后有一个函数可以在必要时追加?
在尚未包含“http://”的 URL 前添加“http://”
IT技术
javascript
html
variables
2021-03-12 17:14:34
6个回答
如果您还想允许“https://”,我会使用这样的正则表达式:
if (!/^https?:\/\//i.test(url)) {
url = 'http://' + url;
}
如果您不熟悉正则表达式,以下是每个部分的含义。
^
- 只匹配字符串的开头http
- 匹配文字字符串“http”s?
- 可选匹配“s”:
- 匹配一个冒号\/\/
- 转义“/”字符,因为它们标记了正则表达式的开始/结束- 正则表达式后的“i”使其不区分大小写,因此它将匹配“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; }
使用 URI 解析库,例如JS-URI。
if (new URI(s).scheme === null) { s = 'http://' + 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 的客户端就不会弄乱链接。
ES6,一个内胆
这是一种“现代”方法:
const withHttp = url => !/^https?:\/\//i.test(url) ? `http://${url}` : url;
您现在可以将其withHttp
用作函数:
const myUrl = withHttp("www.example.org");
这是我用来即时满足的东西。在 jquery 中使用 keyup 侦听器。
$('#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());
}
});