Задать вопрос
@sitev_ru
sitev.ru - мой блог ...

Существует ли универсальный алгоритм разбора УРЛа?

Должен, как я понимаю, разбирать следующее:

name1=value1&name2=value2
param1/param2/param3
param1/param2/name1=value1&name2=value2
  • Вопрос задан
  • 834 просмотра
Подписаться 5 Оценить 4 комментария
Пригласить эксперта
Ответы на вопрос 8
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Вы желаете странного, но учитывая, что на URL есть спецификация, то можно сказать что да, универсальный алгоритм разбора URL существует.
Ответ написан
viktorvsk
@viktorvsk
Посмотрите любой веб-сервер и попробуйте поотправлять параметры.
param1/param2/param3

Что это такое - слабо понятно.
Возьмите любой популярный фреймоврк и посмотрите, как там работает диспатчер
Кто вам сказал, что param1/param2 - это не param1 в который входит неэкранированный слэш?

А лучше - озвучьте преследуемую цель.
Ответ написан
trevoga_su
@trevoga_su
Существует ли универсальный алгоритм разбора УРЛа
нет. не существует и не может быть универсального разбора части path URL-адреса. Потому что можно создать абсолютно любой виртуальный path.
Ответ написан
Комментировать
@sitev_ru Автор вопроса
sitev.ru - мой блог ...
Набросал примерчик (отрывок из кода), меня на первых порах устроит, может кому пригодится:
string path = "param1/param2/name1=value1&name2=value2";

	pos = 0;
	int posEnd = path.length();
	int mode = 1;
	int index = 1;
	string name = "", value = "";

	while (true) {
		if (pos >= posEnd || path[pos] == '/' || path[pos] == '&') {
			if (mode == 1) {
				if (name != "") {
					value = name;
					name = "p" + to_string(index);
					index++;
					params.insert(name, value);
					name = "";
					value = "";
				}
			}
			else {
				params.insert(name, value);
				name = "";
				value = "";
				mode = 1;
			}
			if (pos >= posEnd) break;
		}
		else if (path[pos] == '=') {
			mode = 2;
		}
		else {
			if (mode == 1) name += path[pos]; else value += path[pos];
		}
		pos++;
	}
Ответ написан
Комментировать
Лучший путь - это посмотреть, как реализован роутинг в современных фреймворках. В вашем примере строка некорректная, корректно будет так: param1/param2?name1=value1&name2=value2 - знаком вопроса отделяются параметры от пути. А какой смысл в велосипедах, если удобная работа с роутером и многими другими вещами очень удобно реализована до вас куда более опытными коллегами в виде symfony, laravel и других фреймворков?

symfony-gu.ru/documentation/ru/html/book/http_fund... - вот почитайте, надеюсь, поможет.
Ответ написан
DIITHiTech
@DIITHiTech
Fullstack javascript developer
function decodePath(url){

           var parts=(url+"").split("?",2),
               path=(parts[0]+'').split("/"),
               query=(parts[1]+'').split("&"),
               params={};

               query.forEach(function(value){
                   var group=value.split("=");
                   params[group[0]]=group[1];
               });

           return {
               path:path,
               params:params
           };
       }

       console.log(decodePath("param1/param2/?name1=value1&name2=value2"));

/*
Вернет	
params:	Object { name1="value1",  name2="value2"}
path :  ["param1", "param2", ""]
*/
Ответ написан
Комментировать
Насколько я понял вопрос вам может помочь использование регулярных выражений.
Ответ написан
Комментировать
Nipheris
@Nipheris Куратор тега C++
Если вам так нужен самописный сервер на плюсах, попробуйте для разбора урла использовать вот это: cpp-netlib.org/0.11.1/in_depth/uri.html#generic-ur... , а вообще можете и сервер попробовать оттуда взять.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы