我正在处理一种情况,我需要用户输入各种URL(例如:用于其个人资料)。但是,用户并非总是以https://example.com
格式插入URL。他们可能会插入以下内容:
example.com
example.com/
example.com/somepage
me@example.com
之类的东西或其他不可接受的东西如何将URL规范化为可能导致网址的格式?我在网络浏览器中看到了这种现象。我们几乎总是在网络浏览器的栏中输入糟糕的内容,它们可以区分是搜索还是可以转换为URL的内容。
我尝试在很多地方寻找,但似乎找不到任何解决方法。
如果可能,我希望为Node编写一个解决方案。非常感谢你!
答案 0 :(得分:3)
使用节点的URL API和一些手动检查。
示例代码:
const { URL } = require('url')
let myTestUrl = 'https://user:pass@sub.host.com:8080/p/a/t/h?query=string#hash';
try {
if (!myTestUrl.startsWith('https://') && !myTestUrl.startsWith('http://')) {
// The following line is based on the assumption that the URL will resolve using https.
// Ideally, after all checks pass, the URL should be pinged to verify the correct protocol.
// Better yet, it should need to be provided by the user - there are nice UX techniques to address this.
myTestUrl = `https://${myTestUrl}`
}
const normalizedUrl = new URL(myTestUrl);
if (normalizedUrl.username !== '' || normalized.password !== '') {
throw new Error('Username and password not allowed.')
}
// Do your thing
} catch (e) {
console.error('Invalid url provided', e)
}
在此示例中,我仅将http
和https
用于要点。
直接从文档中获得API的可视化效果
┌─────────────────────────────────────────────────────────────────────────────────────────────┐
│ href │
├──────────┬──┬─────────────────────┬─────────────────────┬───────────────────────────┬───────┤
│ protocol │ │ auth │ host │ path │ hash │
│ │ │ ├──────────────┬──────┼──────────┬────────────────┤ │
│ │ │ │ hostname │ port │ pathname │ search │ │
│ │ │ │ │ │ ├─┬──────────────┤ │
│ │ │ │ │ │ │ │ query │ │
" https: // user : pass @ sub.host.com : 8080 /p/a/t/h ? query=string #hash "
│ │ │ │ │ hostname │ port │ │ │ │
│ │ │ │ ├──────────────┴──────┤ │ │ │
│ protocol │ │ username │ password │ host │ │ │ │
├──────────┴──┼──────────┴──────────┼─────────────────────┤ │ │ │
│ origin │ │ origin │ pathname │ search │ hash │
├─────────────┴─────────────────────┴─────────────────────┴──────────┴────────────────┴───────┤
│ href │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
答案 1 :(得分:0)