javascript-在[[[http://“]]之前添加一个尚未包含“ http://”的URL
我有一个input
字段,该字段保存一个URL,我希望此保存的输入可以识别变量的开头何时不存在“ Http //”,但不知道从何处开始...是否可以仅检查一个 字符串的一部分? -然后有一个必要时会附加的功能?
如果您还想允许“ [https://”,]我将使用如下正则表达式:
if (!/^https?:\/\//i.test(url)) {
url = 'http://' + url;
}
如果您不熟悉正则表达式,那么这就是每个部分的含义。
^
-仅在字符串开头匹配\/\/
-匹配文字字符串“ http”\/\/
-(可选)匹配“ s”\/\/
-匹配冒号\/\/
-转义“ /”字符,因为它们标记了正则表达式的开始/结尾- 正则表达式后的“ i”使其不区分大小写,因此将匹配“ [HTTP://”,]等。
以下是您所需的简单解决方案:
var prefix = 'http://';
if (s.substr(0, prefix.length) !== prefix)
{
s = prefix + s;
}
但是,您应该注意几件事...
这里的测试区分大小写。 这意味着如果字符串最初是if (new URI(s).scheme === null)
{
s = 'http://' + s;
}
,则它将更改为http://
,这可能不是您想要的。 您可能也不应修改任何以://
开头的字符串,否则可能会得到类似http://https://example.com
的结尾。
另一方面,如果您收到诸如if (new URI(s).scheme === null)
{
s = 'http://' + s;
}
之类的输入,则您可能希望添加http://
,因此仅搜索://
对于一般解决方案可能不够好。
替代方法
使用正则表达式:
if (new URI(s).scheme === null) { s = 'http://' + s; }
使用URI解析库(例如JS-URI)。
if (new URI(s).scheme === null) { s = 'http://' + s; }
相关问题
- JavaScript equalsIgnoreCase:不区分大小写的字符串比较
- javascript startswith
- 如何将URL解析为javascript中的主机名和路径?
从Linkenizer提起(不介意为空)
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的客户端不会弄乱链接。
这是我用于即时满足的内容。 在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());
}
});
我更改了@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;
}
ES6,一根内胆
这是一种“现代”方法:
const withHttp = url => !/^https?:\/\//i.test(url) ? `http://${url}` : url;
您现在可以将withHttp
用作功能:
const myUrl = withHttp("www.example.org");
下面的代码段检查:
- 检查网址是否为空
- 删除开头或结尾的杂散空格
检查[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 }
像这样(通过内存写入)?
if (url.toUpper(url.substring(0, 7) != "HTTP://")
url = "http://" + url;
if (url.indexOf('http://') != 0)
url = 'http://' + url;
我个人使用它,这部分取自php docs
$scheme = parse_url($link, PHP_URL_SCHEME);
if (empty($scheme)) {
$link = 'http://' . ltrim($link, '/');
}
我将@Morgan Taylor和@Mark Byers的答案更改为不区分大小写。 与[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;
}
您可以使用System.String成员的“ StartsWith”。
if (url.ToUpper().StartsWith("HTTP://"))
{
}