PHP "parse_url" в JavaScript
Я написал JavaScript-копию PHP функции parse_url.
Насколько я уже написал, функция выполняет свою работу и возвращает объект JS...
Но есть ли лучший способ сделать это:
function parse_url( url ) {
if(typeof url == 'string') {
// output following: scheme, host, user, pass, path, query, fragment
var output = {};
var split_scheme = url.split('//');
// now we assume that we have: sheme, and the rest of the url after //
if(split_scheme.length == 2) {
// now we have the "scheme"
// do not add if this URL is provided: //hostname/path?query=value#anchor
if(split_scheme[0].length) {
output.scheme = split_scheme[0].replace(':', '');
}
// we're now splitting the URL on first slash /
// and assume that we'll get: host, (user and pass, if any);
var split_url = split_scheme[1].split('/');
if(split_url.length == 2) {
// check if user/pass are provided
var split_auth_hostname = split_url[0].split('@');
output.host = split_auth_hostname[1];
if(split_auth_hostname.length == 2) {
// now split the auth part of the hostname with ":"
var split_user_info = split_auth_hostname[0].split(':');
if(split_user_info.length == 2) {
// assume that both user and pass are provided now
output.user = split_user_info[0];
output.pass = split_user_info[1];
} else {
// assume that only "user" is provided
output.user = split_user_info[0];
}
} else {
// assume that no auth info was provided in the URL
// first splitted element is the actual hostname
output.host = split_auth_hostname[0];
}
// now let's split the query/anchor from path
var split_query = split_url[1].split('?');
output.path = '/' + split_query[0];
if(split_query.length == 2) {
// now split the anchor out of query string
var split_anchor = split_query[1].split('#');
// add the query without anchor
output.query = split_anchor[0];
// add anchoer
if(split_anchor.length == 2) {
output.fragment = '#' + split_anchor[1];
}
} else {
output.query = split_query[0];
}
}
}
return output;
}
}
Я создал демо jsfiddle здесь.
2 ответа
Сегодня вы можете использоватьnew URL('https://stackoverflow.com/questions')
https://developer.mozilla.org/en-US/docs/Web/API/URL
console.log(new URL('https://www.example.com/dogs#start'));
{
hash: "start"
host: "www.example.com"
hostname: "www.example.com"
href: "http://www.example.com/dogs"
origin: "http://www.example.com"
password: ""
pathname: "/dogs"
port: ""
protocol: "https:"
search: ""
searchParams: URLSearchParams { }
username: ""
}
Тест производительности от jsPerf показывает, что использование регулярных выражений будет быстрее.
Я использовал регулярное выражение из JavaScript хороших частей. Это пример из учебника, и он работает на 73% быстрее, чем ваш код, так что ожидайте, что производственный качественный код будет работать лучше и одинаково в худшем случае.
URL для сравнения http://jsperf.com/parse-url.
И код используется:
function parse_url_regex(url) {
var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
var result = parse_url.exec(url);
return result;
}
Но я настоятельно рекомендую вам попробовать codereview.stackexchange.com